我应该使用工会来加快执行时间吗?

时间:2017-11-20 09:33:40

标签: c unions

我使用的是8x8矩阵,其值可以在-6到+6之间。

虽然它可以存储在char矩阵中,但我认为使用int类型应该更快,因为在加载到寄存器时没有必要对值进行符号扩展。我还读到它会导致缓存问题,但我认为不应该发生。

这就是因为我复制了很多次这个矩阵,我认为创建一个类似的联盟是值得的:

union my_union{
char c[8];
int64_t i;
};

只能制作8份而不是64份。不建议出于任何原因吗?

编辑:

使用的架构是x86_64。编译器是GCC 5.4,激活-O3标志。

1 个答案:

答案 0 :(得分:1)

关于union类型 - 将8个元素char投降到int64_t

  

不建议出于任何原因吗?

它不是明确定义的C代码。读取union的不同成员而不是最后写入的成员是未定义的行为,极少有例外。*另外,即使忽略它,虽然int64_t有一些强有力的保证(如64位,没有填充, ...),char可能有超过8位,留下你的副本基于int64_t错误/缺少一些位。

正如已经评论过的那样,尝试表现良好的对象副本的第一件事是标准库函数memcpy()。预计在大多数情况下表现最佳。

*)一个值得注意的例外是union包含两个共享一个公共初始序列的struct。鉴于union声明是可见的,在这种情况下允许检查“其他”成员。