C++ 如何对齐std::数组中包含的数据?
由于C++ 如何对齐std::数组中包含的数据?,c++,arrays,c++11,std,memory-alignment,C++,Arrays,C++11,Std,Memory Alignment,由于std::array不允许更改其分配器,是否有方法确保指向数据地址的指针对齐 例如,在GNUG++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<lon
std::array
不允许更改其分配器,是否有方法确保指向数据地址的指针对齐
例如,在GNUG++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;
}
编辑
为了举例说明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;
}
#包括
#包括
内部主(空)
{
alignas(16)std::数组a;
alignas(16)std::数组b;
alignas(16)std::array c;
alignas(16)std::数组d;
alignas(16)std::array e;
alignas(16)std::数组f;
默认情况下,编译器在对齐时会做正确的事情
但您可以使用对齐作为覆盖它:
alignas(16) std::array<char, 10> b;
alignas(16)std::数组b;
后记
有趣的是,英特尔编译器认为在8字节上对齐一个char[]
就足够了。这就好像它知道在x86平台上,如果将字符对齐得再宽一点,收益就会很小
请记住,过多的对齐可能会由于内存使用增加和缓存效率降低而降低性能。现代x86体系结构(Sandy Bridge和更新版本)可以非常高效地处理未对齐的数据,但无法补偿部分使用的缓存线().std::array不与任何分配器一起工作。它只包含一个成员t数据[N]是的,我知道@Nawaz。这就是为什么我要问:)@RustyX谢谢!我不知道alignas
。如果你给出答案,我会接受。std::array
只包含元素数组。如果你对齐它,你也会对齐底层数组。这就是我要找的。有趣的是,icpc没有对齐array
>和array
。我经常使用以下构造:template struct\uuuu attribute\uuuuu((aligned(16)))aligned\u array:public std::array{};
这样我就不需要到处写alignas
。@jensumnk你也可以这样做:template struct alignas(16)aligned\u array{};
@CiroSantilli冠状病毒审查六四事件法轮功 请参阅:“指向标准布局结构对象的指针(使用reinterpret_转换进行适当转换)指向其初始成员”。因此,它们必须具有相同的地址,从而具有相同的对齐方式。
#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;
}
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(16) std::array<char, 10> b;