VS2019中如何实现数组任意对齐?alignas代码对齐失效求解
实现4096字节对齐的动态数组:可行,但你用错了方法
首先得指出你代码里的核心问题:你把alignas(4096)加在了指针变量p上,而不是你真正想对齐的动态分配的数组内存上。这就导致指针p本身的地址可能符合对齐要求,但它指向的数组内存根本没按4096字节对齐,自然输出的地址末尾不会是三个0。
不过你的需求完全是可行的,下面给你几种在VS2019里有效的实现方式:
方法1:C++17 对齐new表达式(推荐)
C17标准开始支持在new时直接指定对齐要求,这是最符合C风格的写法:
#include <iostream> int main() { int* p = new (align_val_t(4096)) int[1024]; printf("%x", p); // 记得用delete[]释放,和对齐new配对 delete[] p; return 0; }
注意要在VS2019里开启C17支持:项目属性 -> C/C -> 语言 -> C++标准,选择ISO C++17标准(/std:c++17)。
方法2:C标准库aligned_alloc函数
如果你兼容C标准,aligned_alloc是个不错的选择(C11引入,VS2019支持):
#include <cstdlib> int main() { // 注意:分配的总大小必须是对齐值的整数倍 size_t total_size = 1024 * sizeof(int); // 4096字节,刚好是4096的1倍 int* p = static_cast<int*>(aligned_alloc(4096, total_size)); if (p != nullptr) { printf("%x", p); free(p); // 必须用free释放,不能用delete } return 0; }
这里要特别注意:aligned_alloc要求分配的总大小必须是对齐值的整数倍,否则会返回nullptr。你的例子里1024个int刚好是4096字节,满足要求。
方法3:VS特定扩展_aligned_malloc
微软提供了自己的内存对齐分配函数,兼容性好(不用依赖C++17):
#include <malloc.h> int main() { int* p = static_cast<int*>(_aligned_malloc(1024 * sizeof(int), 4096)); if (p != nullptr) { printf("%x", p); _aligned_free(p); // 必须用_aligned_free释放 } return 0; }
这个是VS环境下的专属方案,如果你只针对Windows平台开发,用这个也很稳妥。
用上面任意一种方法,你分配的数组内存都会按4096字节对齐,输出的十六进制地址末尾自然会是三个0(因为4096 = 0x1000,对齐后的地址最后三位十六进制必然是0)。
内容的提问来源于stack exchange,提问作者Saitama10000
相关产品推荐
相关产品推荐

