gpt4 book ai didi

c++ - 对齐堆栈上的数据 (C++)

转载 作者:IT老高 更新时间:2023-10-28 23:00:15 31 4
gpt4 key购买 nike

这个问题特定于 MSVC 编译器(特别是 2008 年),但我也对非编译器特定的答案感兴趣。

我正在尝试根据某些任意类型的对齐方式来确定如何对齐堆栈上的字符缓冲区。理想情况下,代码如下:

__declspec( align( __alignof(MyType) ) ) char buffer[16*sizeof(MyType)];

不幸的是,这不起作用

error C2059: syntax error : '__builtin_alignof'

编译器只是不喜欢嵌套语句。

我唯一的另一个想法是这样做:

char buffer[16*sizeof(MyType)+__alignof(MyType)-1];
char * alignedBuffer = (char*)((((unsigned long)buffer) + __alignof(MyType)-1)&~(__alignof(MyType)-1));

有人知道更好的方法吗?似乎 declspec 的东西应该可以工作,我只是语法错误还是什么?

感谢阅读:)

最佳答案

您可以使用 std::aligned_storage连同 std::alignment_of作为替代品。

#include <type_traits>

template <class T, int N>
struct AlignedStorage
{
typename std::aligned_storage<sizeof(T) * N, std::alignment_of<T>::value>::type data;
};

AlignedStorage<int, 16> myValue;

MSVC 2008 及更高版本支持此功能。如果您需要移植到其他非 C++11 编译器,您可以使用 std::tr1::aligned_storagestd::tr1::alignment_of<tr1/type_traits>标题。

在上面的代码中,AlignedStorage<T>::data将是 POD 类型(MSVC 和 GCC 中的 char[] 数组),适合 T 和大小 T*N 对齐。

关于c++ - 对齐堆栈上的数据 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5134217/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com