正如其他人所说,不需要支持过度对齐的类型。使用前请检查编译器文档。
您可以尝试使用以下方法之一来解决您的问题:
1)过度分配你的数组(通过(desired aligment / sizeof element) - 1
)并使用标准::对齐 http://en.cppreference.com/w/cpp/memory/align。链接到libstdc++执行 https://gcc.gnu.org/viewcvs/gcc/trunk/libstdc%2B%2B-v3/include/std/memory?view=markup#l114.
2)声明一个包含数组的结构体desired aligment / sizeof element
元素并按所需对齐方式对齐。它should如果您使用此类结构的数组,则会在内存中为您提供紧凑的表示形式,但您将无法使用正常的数组表示法或指针算术(因为它(a)未定义的行为,(b)它们很可能不会被使用随意放置)
3) 编写自己的对齐分配函数。请注意,您可以添加自己的运算符版本new
and delete
.
namespace my
{
struct aligned_allocator_tag {};
aligned_allocator_tag aligned;
}
void* operator new( std::size_t count, my::aligned_allocator_tag, std::size_t aligment);
void* operator new[]( std::size_t count, my::aligned_allocator_tag, std::size_t aligment)
{
return ::operator new(count, my::aligned, aligment);
}
//Usage
foo* c = new(my::aligned, 16) foo[20];
您将需要分配内存,保留足够的空间来存储原始指针(由 malloc/whatever 返回)或指针被移位的字节量,因此后续删除将释放正确的指针,将指针对齐到所需的大小并返回它。
Here is 一个答案 https://stackoverflow.com/a/6320500/3410396, 和另一个 https://stackoverflow.com/a/227900/3410396,它展示了如何对齐内存。
请注意,这两个答案都使用实现定义的行为,即对转换为整数的指针进行按位算术并将其转换回来。唯一真正完全标准的方法是将内存投射到char*
并添加其值与下一个对齐地址之间的差值。
如果你可以使用一些非标准的内存分配函数,你可以将它们包装成自定义运算符new
too.