我使用的是8x8矩阵,其值可以在-6到+6之间。
虽然它可以存储在char矩阵中,但我认为使用int类型应该更快,因为在加载到寄存器时没有必要对值进行符号扩展。我还读到它会导致缓存问题,但我认为不应该发生。
这就是因为我复制了很多次这个矩阵,我认为创建一个类似的联盟是值得的:
union my_union{
char c[8];
int64_t i;
};
只能制作8份而不是64份。不建议出于任何原因吗?
编辑:
使用的架构是x86_64。编译器是GCC 5.4,激活-O3标志。
答案 0 :(得分:1)
关于union
类型 - 将8个元素char
投降到int64_t
:
不建议出于任何原因吗?
它不是明确定义的C代码。读取union
的不同成员而不是最后写入的成员是未定义的行为,极少有例外。*另外,即使忽略它,虽然int64_t
有一些强有力的保证(如64位,没有填充, ...),char
可能有超过8位,留下你的副本基于int64_t
错误/缺少一些位。
正如已经评论过的那样,尝试表现良好的对象副本的第一件事是标准库函数memcpy()
。预计在大多数情况下表现最佳。
*)一个值得注意的例外是union
包含两个共享一个公共初始序列的struct
。鉴于union
声明是可见的,在这种情况下允许检查“其他”成员。