C++ 推荐使用 `memset` 置零数据结构

作者: , 共 449 字 , 共阅读 0

假设在 C++里有一个数据结构:

struct Data {
    int a;
    int b;
};

我们可以有三种方法置零,最简单直接的:

Data data;
data.a = data.b = 0;

也可以用聚合列表初始化:

Data data = {};

或者用memset填充:

Data data;
memset(&data, 0, sizeof(data));

其中第二种写法最简单,不用引入头文件,且可以在一行里写完。但第二行可能有严重的跨程序的兼容性问题。问题出现在因为对齐问题,数据结构有填充空间时,填充空间会有随机非零内容。比如下面数据结构:

struct Data {
    int a;
    char b;
    int c;
};

因此推荐无论任何时候,都使用memset进行 0 初始化。从效率上看,也是 memset 更快。三种方式的汇编码可参考: https://godbolt.org/z/TMohvx 。

Q. E. D.

类似文章:
Rob Pike, 最伟大的 C 语言大师之一 , 在Notes on C Programming(英文原文)中从另一个稍微不同的角度表述了 Unix 的哲学:
编程 » C++, C++11
花括号初始化是C++11引入的一种初始化方法。
Xie Xie 给我看了一个链接性能调优--永远超乎想象,里面提到了素数筛法的复杂度,作者用实验发现此筛法是线形的。
理论计算机(I)课上讲的一个问题,很有意思。
编程 » Java, Matlab
Matlab 2008b 才开始引入 containers.Map ,这是 Matlab 唯一的数据结构(这里的数据结构是指自带一定逻辑性的数据结构,不包括普通数据类型)。如果要有其它,比如 Queue、Set 等数据结构,只能自己编写一个。File Exchange 上有不少人做过这个工作,我也写过Queue、List、Vector 的 Matlab 对象。不过 Matlad 的面向对象编程效率极低,这种方法只能用于不太注重效率的场合。解决这个问题的另外一个方法是使用 Java 对象。
编程 » Linux, Vim, 文件编码
由于 UNICODE 的优势,目前推荐都用 UTF-8 进行编码。
编程 » C++, 智能指针
理论上而言,当 C++提供了std::unique_ptr, C++的程序就不应该出现普通指针了。所有普通指针都可以用std::unique_ptr代替,避免手动删除对象。
编程 » C++, 代码片段
主要函数是timespec_get,可参考https://zh.cppreference.com/w/c/chrono/timespec_get
相似度: 0.064
编程 » C++, 算法, 代码片段
一个短小、高效的 C++函数,用来判断指定日期是星期几:
编程 » C++,
C++的多行宏有标准定义方式,boostfolly库都采用了这种方式:
前一篇:
misc »
1、查看当前状态
编程 » Python
Python 在搜索模块时,依次搜索sys.path里的位置,直到找到模块为止。下面命令可以查看当前的搜索路径: