Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何对齐std::数组中包含的数据?_C++_Arrays_C++11_Std_Memory Alignment - Fatal编程技术网

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;