memset的速度vs直接分配为零

LML

请在下面考虑结构定义。

struct xyz {
  char a;
  void *ptr;
  uint16_t num1;
  uint32_t num2;
  uint64_t num3;
};

我可以通过以下三种方式之一将此结构的实例初始化为零。

  1. 申报时

    struct xyz instance = { 0 };
    
  2. 使用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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

直接分配速度与AddForce()

C - free() 或 memset() 为零和 free()?

根据速度为椭圆分配颜色

对象属性为零,尽管为其分配了值

用memset()设置为零;初始化为静态结构定义是什么意思?

当在performBlock中分配时,NSManagedObjectContext为零

在列表中指定的索引处为张量分配零

即使分配了值,SwiftUI @State枚举仍然为零

Ruby:分配并检查一行是否为零

分配给数组元素的值显示为零

Nuttx堆分配失败:堆大小为零

c中的数据复制方法直接分配vs memcpy

React.js建议直接为状态分配`props'

每当速度为 0 时,将其保持为零的时间加起来 (r)

为什么要使用闭包进行分配,而不是直接为键分配值?

直接为浮点变量分配十六进制整数与通过指针转换分配之间的区别

strlen vs停止为零的字符串操作的性能

HDF5 数据加载速度非常慢。导致 GPU 波动率为零

直接分配或带分配控制

分配零容量ByteBuffer

零图中的条目分配

memset为什么不分配1?

在R的k个单位之间分配n而不重复且R中的结构为零

Valgrind错误-分配后地址为零字节-C / C ++

有没有办法为std :: chrono :: nanoseconds分配零

如果不在 R 中的向量中,如何将元素分配为零?

赋值为零时,通过从块中返回值来分配变量

在PostgreSQL中特定字段的平均值为null时如何分配零(0)

我们如何正确分配Pod,以便KFServing可以将GPU实例缩小为零?