如何将 __declspec(align(16)) 与模板一起使用?

问题描述 投票:0回答:2

我正在努力使我的

class 16-byte
__declspec(align(16))
对齐;然而它是一个模板类。

如果我将

__declspec(align(16))
放在 template 关键字之前,它会告诉我那里不允许使用变量属性。

如果我将它放在 class 关键字之前,整个类将变得无效并且所有方法都会显示错误。

那么它是如何做到的呢?

c++ class visual-c++ alignment
2个回答
1
投票

这个实现可能会回答这个请求:

template <class T, std::size_t Align>
struct alignas(Align) aligned_storage
{
    T a;
    T b;
};

template <class T, std::size_t Align>
struct aligned_storage_members
{
    alignas(Align) T a;
    alignas(Align) T b;
};

int main(int argc, char *argv[]) {
    aligned_storage<uint32_t, 8> as;
    std::cout << &as.a << " " << &as.b << std::endl;

    aligned_storage_members<uint32_t, 8> am;
    std::cout << &am.a << " " << &am.b << std::endl;
}

// Output: 
0x73d4b7aa0b20 0x73d4b7aa0b24
0x73d4b7aa0b30 0x73d4b7aa0b38

第一个结构体(当然可以定义为一个类)是8字节对齐的,而第二个结构体本身并不是对齐的,而是每个成员都是8字节对齐的


0
投票

将对齐声明放在

class
关键字之后、类名之前:

template<typename xyz>
class __declspec(align(16)) myclass
{
...
};
© www.soinside.com 2019 - 2024. All rights reserved.