我应该使用联合来加快执行时间吗?
Should I use unions to accelerate execution time?
我使用的是 8x8 矩阵,其值介于 -6 和 +6 之间。
虽然它可以存储在char矩阵中,但我认为使用int类型应该更快,因为在加载到寄存器时不需要对值进行符号扩展。我还读到它可能会导致缓存问题,但我认为它不应该发生。
问题是,当我多次复制这个矩阵时,我认为创建一个类似于以下的联合可能是值得的:
union my_union{
char c[8];
int64_t i;
};
为了只制作8份而不是64份。为什么不推荐这样做?
编辑:
使用的架构是 x86_64。编译器是激活了 -O3 标志的 GCC 5.4。
关于 union
将 8 个元素 char
类型双关到 int64_t
:
Is it not recommended for any reason?
它不会是定义明确的 C 代码。读取与上次写入的成员不同的 union
成员是未定义的行为,只有极少数例外。*此外,即使忽略这一点,而 int64_t
有一些强有力的保证(如 64 位,无填充, ...),char
可能有超过 8 位,使您的副本基于 int64_t
错误/缺少一些位。
如前所述,要获得性能良好的对象副本,首先要尝试的是标准库函数 memcpy()
。它有望在大多数情况下表现最佳。
*) 一个值得注意的例外是 union
包含两个 struct
共享一个公共初始序列。鉴于 union
声明可见,在这种情况下允许检查 "other" 成员。
我使用的是 8x8 矩阵,其值介于 -6 和 +6 之间。
虽然它可以存储在char矩阵中,但我认为使用int类型应该更快,因为在加载到寄存器时不需要对值进行符号扩展。我还读到它可能会导致缓存问题,但我认为它不应该发生。
问题是,当我多次复制这个矩阵时,我认为创建一个类似于以下的联合可能是值得的:
union my_union{
char c[8];
int64_t i;
};
为了只制作8份而不是64份。为什么不推荐这样做?
编辑:
使用的架构是 x86_64。编译器是激活了 -O3 标志的 GCC 5.4。
关于 union
将 8 个元素 char
类型双关到 int64_t
:
Is it not recommended for any reason?
它不会是定义明确的 C 代码。读取与上次写入的成员不同的 union
成员是未定义的行为,只有极少数例外。*此外,即使忽略这一点,而 int64_t
有一些强有力的保证(如 64 位,无填充, ...),char
可能有超过 8 位,使您的副本基于 int64_t
错误/缺少一些位。
如前所述,要获得性能良好的对象副本,首先要尝试的是标准库函数 memcpy()
。它有望在大多数情况下表现最佳。
*) 一个值得注意的例外是 union
包含两个 struct
共享一个公共初始序列。鉴于 union
声明可见,在这种情况下允许检查 "other" 成员。