【问题标题】:How do compilers implement __declspec(align(x)) / __attribute__((aligned(x)))?编译器如何实现 __declspec(align(x)) / __attribute__((aligned(x)))?
【发布时间】:2019-03-05 23:03:59
【问题描述】:

想象一下这样的结构:

struct S {
    __declspec(align(32)) double A[4]; // MSVC / ICL on Windows
    double A[4] __attribute__((aligned(x))); // CLANG / GCC
};

结构可以在堆栈上分配,也可以使用 malloc 分配,无论哪种方式,结构实例本身都可能不对齐。那么我们可以指望成员 A 是 32 字节对齐的吗?如果是这样,编译器是如何做到的?

【问题讨论】:

  • 寻找alignas
  • 谢谢,那个可以吗?你能详细说明一下吗?我的意思是我假设编译器可以分配“最坏情况”,然后在使用时对齐指针,但是如果你要 memcpy 结构,你就会遇到问题......

标签: c++ visual-c++ alignment memory-alignment


【解决方案1】:

至少对于 MSVC,因为 __declspec(align()) 的文档说它只影响静态和自动对象分配,而不影响动态分配。如果要控制动态分配对齐,则需要使用提供该功能的函数,例如 _aligned_malloc。

【讨论】:

  • 当您将这些类型之一与new 一起使用时,您会收到警告C4316
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-24
  • 1970-01-01
  • 1970-01-01
  • 2016-07-12
  • 2013-08-12
  • 2019-05-04
相关资源
最近更新 更多