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

作者: , 共 443 字 , 共阅读 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 的哲学:
理论计算机(I)课上讲的一个问题,很有意思。
编程 » C++, C++11
花括号初始化是C++11引入的一种初始化方法。
编程 » Java, Matlab
Matlab 2008b 才开始引入 containers.Map ,这是 Matlab 唯一的数据结构(这里的数据结构是指自带一定逻辑性的数据结构,不包括普通数据类型)。如果要有其它,比如 Queue、Set 等数据结构,只能自己编写一个。File Exchange 上有不少人做过这个工作,我也写过Queue、List、Vector 的 Matlab 对象。不过 Matlad 的面向对象编程效率极低,这种方法只能用于不太注重效率的场合。解决这个问题的另外一个方法是使用 Java 对象。
Xie Xie 给我看了一个链接性能调优--永远超乎想象,里面提到了素数筛法的复杂度,作者用实验发现此筛法是线形的。
由 Facebook 开发和维护的 C++库 Folly 提供了自旋锁的实现folly::MicroSpinLock,代码文件地址:https://github.com/facebook/folly/blob/master/folly/synchronization/MicroSpinLock.h
编程 » pandas, numpy, Python, C++
首先任意定义一个结构,注意不要用 std::string 非平凡布局的变量,用 char[] 代替:
编程 » Linux, Vim, 字符编码
由于 UNICODE 的优势,目前推荐都用 UTF-8 进行编码。
编程 » C++, 智能指针
理论上而言,当 C++提供了std::unique_ptr, C++的程序就不应该出现普通指针了。所有普通指针都可以用std::unique_ptr代替,避免手动删除对象。
编程 » folly, C++, 数据容器
由 Facebook 开发和维护的 C++库 Folly 提供folly::sorted_vector_setfolly::sorted_vector_map,是std::mapstd::set在小数据集上的优化版。代码见: https://github.com/facebook/folly/blob/master/folly/sorted_vector_types.h
前一篇:
IT » crontab, linux
1、查看当前状态
编程 » Python
Python 在搜索模块时,依次搜索sys.path里的位置,直到找到模块为止。下面命令可以查看当前的搜索路径: