gpt4 book ai didi

c - memset 的速度 vs 直接赋值给零

转载 作者:太空狗 更新时间:2023-10-29 15:54:12 24 4
gpt4 key购买 nike

请考虑下面的结构定义。

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

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

  1. 申报时

    struct xyz instance = { 0 };
  2. 有时在使用 C-99 功能声明它之后。

    instance = (const struct xyz) { 0 };

3.memset (&instance, 0, sizeof (struct xyz));

一个典型的 C 结构可能有一些由编译器添加的填充以用于对齐目的。因此 memset 会将填充字节也初始化为零。

我的问题是:

一般来说,用上面的方法一或方法二初始化会比方法三快吗?节省多少 CPU 周期并不重要,我只是好奇 1 和 2 是否比 3 快。

最佳答案

这是实现质量问题。

(顺便说一句,在纯理论中,实现可能有一个 NULL 指针,它不是全零位字;对于这种情况,您的 §3 的语义不同于§1 或 §2;但实际上,当今大多数常见的处理器都有一个线性虚拟地址空间,并且它们的 NULL 指针是一个全零位的字)

最近 GCC启用优化(例如 gcc -O2)的编译器(至少在通常的 x86-64 处理器上)可能会生成相同(或非常相似)的机器代码(因为memset 被扩展为 __builtin_memset,它被专门编译并经常被内联),所以使用 memset 在实践中不会变慢(由于矢量化甚至可能变得更快,例如 AVX 机器指令)

您可以查看使用例如生成的汇编代码gcc -S -fverbose-asm -O2 -march=native

(在某些情况下,特别是当 struct xyz 有数百个字段时,编译器甚至会为您的情况 1 和 2 合成对 memset 的调用! )

In general, will initialization by method 1 or 2 above be faster than method 3?

在实践中,答案通常是否定的(所以更喜欢最可读的方法)。如果您非常关心,请对您的代码进行基准测试。

(不要忘记开发时间也需要花费金钱;在许多情况下,您的人工时间比您可能赢得的几个 CPU 纳秒更有值(value),而且通常不会)

关于c - memset 的速度 vs 直接赋值给零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46189856/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com