c++ - struct __declspec(align(16)) sse_t 和 struct alignas(16) sse_t 有什么区别?

标签 c++ c++11 memory-alignment

struct __declspec(align(16)) sse_t{};struct alignas(16) sse_t{}; 有什么区别?

链接到 C++11 中结构对齐的示例:http://en.cppreference.com/w/cpp/language/alignas

// every object of type sse_t will be aligned to 16-byte boundary
struct alignas(16) sse_t
{
  float sse_data[4];
};

// the array "cacheline" will be aligned to 128-byte boundary
alignas(128) char cacheline[128];

然而,MSVS2012 中没有关键字alignas(16),但您可以使用__declspec(align(16)):Where can I use alignas() in C++11? 我们可以在示例中看到:

#include <iostream>

#ifdef __GNUC__
struct __attribute__(align(16)) sse_t
#else
struct __declspec(align(16)) sse_t
#endif
{
  float sse_data[4];
};

/*
// Why doesn't it support in MSVS 2012 if it is the same as __declspec(align(16)) ?
struct alignas(16) sse_t
{
  float sse_data[4];
};
*/    

int main() {
    // aligned data
    sse_t ab;
    ab.sse_data[1] = 10;

    // what will happen?
    unsigned char *buff_ptr = new unsigned char [1000]; // allocate buffer
    sse_t * unaligned_ptr = new(buff_ptr + 3) sse_t;    // placement new
    unaligned_ptr->sse_data[1] = 20;    

    int b; std::cin >> b;
    return 0;
}
  1. 对齐的这些功能是等价的吗?
  2. 如果是这样 - 等价,为什么不在 MSVS2012 中输入关键字 alignas(),因为此功能已经存在 __declspec(align(16))?<
  3. 如果通过“placement new”将这样的结构放置在未对齐的地址上会发生什么:new(buff_ptr + 3)

最佳答案

  1. 据我所知,它们是等价的,区别在于 struct alignas(16) sse_t{}; 是标准 C++ 而 struct __declspec(align(16)) sse_t{}; 是 C++11 之前的 Microsoft 扩展。
  2. Microsoft 没有在 MSVS2012 的编译器中实现 alignas(),您必须问问他们原因。 IIRC 它在 MSVS2013 中受支持。 编辑:我是个骗子,MSVS2013 still does not support alignas / alignof .
  3. 如果这样的结构错位,很可能会发生可怕的事情。你甚至不需要放置 new 来这样做,普通的旧 new 忽略了超出 C++11 原始类型所需的对齐要求。

关于c++ - struct __declspec(align(16)) sse_t 和 struct alignas(16) sse_t 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19958912/

相关文章:

c++ - c程序内存布局,关于局部变量和全局变量的位置

c++ - 为什么这个 move 构造函数不起作用

c++ - 了解 void f(const T& param) 中参数的类型

c++ - constexpr 函数可以调用返回 void 的函数吗?

c++ - 为什么new第一次会多分配1040字节?

c++ - 在 C++ 中什么时候应该使用类还是结构?

c++ - 与静态方法中的 decltype(*this) 等价?

c++ - move 类数据成员 (C++)

c++ - 编译器如何知道物理地址的对齐方式?

c - GCC 变量对齐问题