【发布时间】:2020-01-15 10:36:03
【问题描述】:
尝试在 VisualStudio 中执行以下操作,但没有成功。
基本上我输入了TypeA,我想创建一个TypeA的数组,比如说TypeA array[10];
但我希望数组在堆上而不是在堆栈上,因为它会很大(比如0x200000)或其他东西。
所以,我试图在代码方面做的事情如下:
struct TypeA {
UINT64 a;
UINT64 b;
UINT64 c;
UINT64 d;
};
TypeA array[0x10000] = (TypeA[0x10000])malloc(sizeof(TypeA)*0x10000);
【问题讨论】:
-
为什么不使用
std::vector?在没有placement-new 的情况下在这里使用malloc在技术上是未定义的行为,如果TypeA碰巧变得不平凡,迟早会给你带来麻烦。 -
具有超过 200 万个元素的单个数组消耗超过 66 MB 的内存(如您所指定的)通常表示设计选择不佳。您需要考虑使用模式(例如,这 200 万个元素中有多少通常真正需要一次在内存中)。无论如何,在 C++ 中真正需要这样一个数组的极少数实际情况下,使用标准容器(如
std::vector<TypeA>)而不是显式管理动态内存。并改掉以十六进制指定数组大小的习惯 - 这只是业余爱好者。 -
我不想使用向量。我没有描述这种设计的原因是因为它与问题无关。我不确定我所问的是否可能,但如果是的话 - 我想知道如何按照我要求的方式去做。
-
@DanielCohen 如果您有特殊的要求阻止您使用普通 C++,您当然需要在问题中提及它们。我们还应该怎么回答?
-
@Quentin - 问题是,我怀疑这个问题是否存在“异国情调的要求”。异乎寻常的需求不会使
malloc()比使用标准容器更有效——因为大多数支持malloc()的C++ 实现也有效地支持标准容器(及其默认分配器)。实际上,异乎寻常的要求更有可能导致使用具有非默认分配器的标准容器(例如,使用一些专用的非标准资源,例如共享内存)。
标签: c++ arrays visual-studio casting malloc