What is the difference between struct __declspec(align(16)) sse_t and struct alignas(16) sse_t?

瘦欲@ 提交于 2019-12-10 19:17:37

问题


What is the difference between struct __declspec(align(16)) sse_t{}; and struct alignas(16) sse_t{};?

Link to an example of the alignment of structures in 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];

However, there is not in MSVS2012 keyword alignas(16), but you can use __declspec(align(16)): Where can I use alignas() in C++11? What we can see in example:

#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. These functionalities of alignment are equivalent?
  2. And if so - equivalent, why did not entered keyword alignas() in MSVS2012, because this functionality is already there __declspec(align(16))?
  3. And what will happen if such a structure to place on a misaligned address through "placement new": new(buff_ptr + 3)?

回答1:


  1. To my knowledge they are equivalent, the difference being that struct alignas(16) sse_t{}; is standard C++ and struct __declspec(align(16)) sse_t{}; is a pre-C++11 Microsoft extension.
  2. Microsoft hadn't gotten around to implementing alignas() in their compiler in MSVS2012, you'd have to ask them why. IIRC it is supported in MSVS2013. EDIT: I'm a liar, MSVS2013 still does not support alignas / alignof.
  3. Horrible things will likely happen if such a structure is misaligned. You don't even need placement new to do so, plain old new is oblivious to alignment requirements beyond those needed for primitive types as of C++11.


来源:https://stackoverflow.com/questions/19958912/what-is-the-difference-between-struct-declspecalign16-sse-t-and-struct-ali

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!