gpt4 book ai didi

c++ - 如何对齐 std::array 包含的数据?

转载 作者:可可西里 更新时间:2023-11-01 15:09:58 26 4
gpt4 key购买 nike

由于 std::array 不允许更改其分配器,是否有办法确保指向数据地址的指针对齐?

例如,在 GNU g++ 4.8.4 和 6.1.0 中,代码如下

#include <array>
#include <iostream>

int main(void)
{
std::array<bool, 10> a;
std::array<char, 10> b;
std::array<int,10> c;
std::array<long long, 10> d;
std::array<float, 10> e;
std::array<double, 10> f;

std::cout << "array<bool,10>.data() = " << a.data() << std::endl;
std::cout << "array<char,10>.data() = " << (void*) b.data() << std::endl;
std::cout << "array<int,10>.data() = " << c.data() << std::endl;
std::cout << "array<long long, 10>.data() = " << d.data() << std::endl;
std::cout << "array<float, 10>.data() = " << e.data() << std::endl;
std::cout << "array<double, 10>.data() = " << f.data() << std::endl;

return 0;
}

提供以下输出,表明容器数据与 16 字节地址对齐,无论在为 x86-64 位架构编译时包含的数据类型如何。

array<bool,10>.data()       = 0x7ffe660a2e40
array<char,10>.data() = 0x7ffe660a2e30
array<int,10>.data() = 0x7ffe660a2e00
array<long long, 10>.data() = 0x7ffe660a2db0
array<float, 10>.data() = 0x7ffe660a2d80
array<double, 10>.data() = 0x7ffe660a2d30

但是,对于 Intel 的 icpc v16.0.3,即使使用 -align,结果也如下所示。虽然大多数容器与 16 字节地址对齐,但一些(charfloat 数组)与较小的字节地址对齐(分别为 2 字节和 8 字节) .

array<bool,10>.data()       = 0x7ffdedcb6bf0
array<char,10>.data() = 0x7ffdedcb6bfa
array<int,10>.data() = 0x7ffdedcb6ba0
array<long long, 10>.data() = 0x7ffdedcb6b00
array<float, 10>.data() = 0x7ffdedcb6bc8
array<double, 10>.data() = 0x7ffdedcb6b50

编辑

只是为了举例说明 RustyX 的提案,这是更改后的代码

#include <array>
#include <iostream>

int main(void)
{
alignas(16) std::array<bool, 10> a;
alignas(16) std::array<char, 10> b;
alignas(16) std::array<int,10> c;
alignas(16) std::array<long long, 10> d;
alignas(16) std::array<float, 10> e;
alignas(16) std::array<double, 10> f;

std::cout << "array<bool,10>.data() = " << a.data() << std::endl;
std::cout << "array<char,10>.data() = " << (void*) b.data() << std::endl;
std::cout << "array<int,10>.data() = " << c.data() << std::endl;
std::cout << "array<long long, 10>.data() = " << d.data() << std::endl;
std::cout << "array<float, 10>.data() = " << e.data() << std::endl;
std::cout << "array<double, 10>.data() = " << f.data() << std::endl;

return 0;
}

这是用Intel的icpc v16.0.3编译的结果。

array<bool,10>.data()       = 0x7ffe42433500
array<char,10>.data() = 0x7ffe42433510
array<int,10>.data() = 0x7ffe424334a0
array<long long, 10>.data() = 0x7ffe42433400
array<float, 10>.data() = 0x7ffe424334d0
array<double, 10>.data() = 0x7ffe42433450

最佳答案

默认情况下,编译器会在对齐时做正确的事情。

但是你可以用 alignas 覆盖它:

alignas(16) std::array<char, 10> b;

后记

有趣的是,Intel 编译器认为将 char[] 对齐 8 个字节就足够了。就好像它知道在 x86 平台上,将它对齐得更宽一点也没什么好处。

请记住,对齐过多会降低性能,因为会增加内存使用并降低缓存效率。现代 x86 架构(Sandy Bridge 和更新版本)可以非常高效地处理未对齐的数据,但无法补偿部分使用的缓存行 (more info)。

关于c++ - 如何对齐 std::array 包含的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39058850/

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