如果我为某种类型分配内存T- 让它在模板中,让我们说 -
template<typename T>
char* alloc(size_t n) { return new char[n*sizeof(T)] ; }
那么是否有足够的空间来存放n具有类型的元素T?有对齐问题吗?如果他们可以 - 如何正确解决它们?
另外-根据@VladD的建议,我尝试分配具有特殊对齐要求的内存:
#include <iostream>
#include <typeinfo>
using namespace std;
struct alignas(256) D {
char a;
char b;
};
template<typename T>
void* alloc(size_t n) {
return reinterpret_cast<void*>(new
aligned_storage<sizeof(T), alignof(T)>[n]);
}
template<typename T>
int allocSize() {
cout << "sizeof = " << sizeof(T) << ", alignof = " << alignof(
T) << endl;
cout << "type = " << typeid(typename
aligned_storage<sizeof(T), alignof(T)>::type).name() << endl;
return sizeof(typename
aligned_storage<sizeof(T), alignof(T)>::type);
}
int main() {
cout << allocSize<D>() << endl;
cout << alloc<D>(5) << endl;
}
GCC 无法解决 - https://ideone.com/dgo75h。但 Visual Studio 工作正常,但发出:
sizeof = 256, alignof = 256
type = union std::_Align_type<double,256>
256
004A1258
那些。我理解大小和对齐方式,但地址显然没有对齐到 256。我不需要这种对齐方式,这是真的,游戏 - 但事实证明,这样分配内存是不可能的?
不,不会有任何问题。
首先,保证有足够的空间。
其次,关于对齐,new-expression 确保分配的
new char[n]内存与最强的基本对齐要求对齐。也就是说,内存将对齐到alignof(std::max_align_t). 从 new-expression 派生的内存将正确对齐以存储任何支持实现的基本类型和由它们构造的类型。上面的引用以纯文本的形式表示,精确地引入了对分配的内存块结构的限制,
new char[n]以确保在使用特定的内存分配方式时正确对齐。因此,除非您有一些超出最大基本对齐的特殊高级对齐要求,否则您无需担心对齐。
理论上,您需要std::aligned_storage.它应该像这样工作:简单方法对齐的问题很明显:
new char[]它不知道您的对齐要求,并且可能分配未对齐的内存。要在内存中分配对象,您需要放置新的。你应该派上用场
std::align了,这里描述了它的使用。更新:我仔细检查过,它实际上并没有
new遵守自定义对齐要求。因此,您需要自己进行对齐,使用std::align. 事实证明:我们申请:
Visual Studio 2017 上的结果:
如果我们删除
alignas(1024),我们得到