抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

记录 C++ 中使用过的有用代码,以后应该还用的上。

const char, string 与 char 的转化

减少 vector 增加元素的开销

获取文件描述符

读取 ivecs 数据文件

ivecs 格式每个向量构成:4 + dim * 4 字节,4 为一个 int

读取 bvecs 数据文件

bvecs 格式每个向量构成:4 + dim * 1 字节,4 为一个 int

mmap 内存映射读取大文件的一部分

打印错误信息

  • void perror(const char *s) 用来将上一个函数发生错误的原因输出到标准设备 (stderr)。参数 s 所指的字符串会先打印,后面再加上错误原因字符串。此错误原因依照全局变量 error 的值来决定要输出的字符串。在库函数中有个error变量,每个error值对应着以字符串表示的错误类型。当调用函数出错时,该函数已经重新设置了error的值。perror 将输入的一些信息和现在的error所对应的错误一起输出。

  • strerror() 通过标准错误的标号,获得错误的描述字符串,将单纯的错误标号转为字符串描述,方便用户查找错误。

创建虚拟内存

虚拟内存中创建 vector 数组

在虚拟内存中使用定位 new 运算符(placement new),最后手动在虚拟内存中调用 std::vector 的析构函数

placement new

允许在已经分配好的内存区域中创建对象,可以决定对象存储的确切位置。

其中 v_mem 为指针,指向预分配的内存地址。

保存已访问的数据

哈希表 unordered_set

构造 vector:通过其他 STL 容器初始化一个 vector

vector 构造函数:

获取文件大小

通过 seekg()tellg()

多态中父类析构调用子类析构

将析构函数声明为虚函数实现。

barrier 方式的无锁线程同步

Linux 中提供了多种同步机制,其中使用 barrier 是多线程之间进行同步的方法之一。

假设多个线程约定一个栅栏,只有当所有的线程都达到这个栅栏时,栅栏才会放行,否则到达此处的线程将被阻塞。

在代码中,当所有 thread 都执行到 barrier_wait() 后,才继续执行后续代码。

输出结果:

Linux 宏 likely()、unlikely()

使用 likely(),执行 if 后面的语句的机会更大,使用 unlikely(),执行 else 后面的语句机会更大一些。

这里就是程序员可以确定 a>b 在程序执行流程中出现的可能相比较大,因此运用了 likely() 告诉编译器将 fun1() 函数的二进制代码紧跟在前面程序的后面,这样就 cache 在预取数据时就可以将 fun1() 函数的二进制代码拿到 cache 中。这样,也就添加了 cache 的命中率。

同样的,unlikely() 的作用就是告诉编译器,a<=b 可能行大,fun2() 紧跟前面程序。

总之,likelyunlikely 的功能就是添加 cache 的命中率,提高系统执行速度。

条件编译与 CFLAGS

条件编译:

意思是,只有当在编译时宏 PERF_LATENCY_LOG 被定义了,#ifdef ... #endif 中的代码块才会被编译并执行;否则该代码块不会被编译执行。

这个宏可以在多个地方定义:

定义在头文件中

在 CMakeLists.txt 中

通过 CFLAGS 变量。

  • 全局编译
  • 区分编译

对于 Debug 模式,编译选项实际使用的值是 CMAKE_CXX_FLAGSCMAKE_CXX_FLAGS_DEBUG 的值的组合(不管 CMAKE_CXX_FLAGS_RELEASE 设置什么值都不会被加入到编译选项中)。

对于 Release 模式,编译选项实际使用的值是 CMAKE_CXX_FLAGSCMAKE_CXX_FLAGS_RELEASE 的值的组合(不管 CMAKE_CXX_FLAGS_DEBUG 设置什么值都不会被加入到编译选项中)。

在 Makefile 中

通过 CFLAGS 变量。

通过 make 命令

输入 make 编译命令:

在 configure 文件中

configure 文件本质可以看成是 shell 脚本文件,用来在 make 前配置 make 参数。

可以在 configure 文件中根据 configure 的参数来设置 makeCFLAGS 变量值。

这种情况一般是存在多级 Makefile,项目通过 configure 来配置。

这样在 ./configure 时,加上 --with-perf-latency-log 参数,就可以在 CFLAGS 变量中添加 -DPERF_LATENCY_LOG 宏定义,再输入 make 就不需要输入参数了。

局部变量块作用域

大括号 {} 在 C++ 中用于定义一个作用域。在这个作用域内,局部变量被创建并使用;当这个作用域结束时,局部变量会被销毁释放资源。




本站采用 Volantis 主题设计