请在下面考虑结构定义。
struct xyz {
char a;
void *ptr;
uint16_t num1;
uint32_t num2;
uint64_t num3;
};
我可以通过以下三种方式之一将此结构的实例初始化为零。
申报时
struct xyz instance = { 0 };
使用C-99功能进行声明后的某个时间。
instance = (const struct xyz) { 0 };
3。memset (&instance, 0, sizeof (struct xyz));
典型的C结构可以由编译器添加一些用于对齐目的的填充。因此memset会将填充字节也初始化为零。
我的问题是:
通常,通过以上方法1或2进行初始化是否会比方法3更快?不管保存多少CPU周期都没关系,我只是好奇1和2是否比3快。
这是实施质量的问题。
(顺便说一句,从纯理论上讲,一个实现可能有一个NULL
不是全零位字的指针;在这种情况下,§3的语义不同于§1或§2的语义;但是实际上,当今大多数通用处理器具有线性虚拟地址空间,并且其NULL
指针为全零的字)
最近GCC编译器(至少在通常的x86-64处理器),以使能优化(例如gcc -O2
)有可能产生相同(或非常相似的)机器代码(因为memset
作为被扩大__builtin_memset
,其被具体地编译和经常内联),所以使用memset
是实际上并不慢(并且由于矢量化,甚至可能变得更快,例如AVX机器指令)
您可以看一下例如产生的汇编代码 gcc -S -fverbose-asm -O2 -march=native
(在某些情况下,特别是当struct xyz
有数百个字段时,编译器甚至会memset
为您的情况1和2合成对调用!)
通常,通过以上方法1或2进行初始化是否会比方法3更快?
在实践中,答案通常是“否”(因此,首选最易读的方法)。如果您很在意,请对您的代码进行基准测试。
(不要忘记开发时间也要花钱;在许多情况下,您的人为之物所花的时间要比您可能会赢得的CPU纳秒多,而且通常不会)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句