WDK 的数组标头大小(以C++为单位)
Header size of array in C++ for WDK
不确定"header"是否是正确的术语,所以如果不是,请纠正我。
我尝试首先分配内存,然后使用重载(放置(new[] 运算符来初始化类对象数组(例如 MyClass(。
比如说,MyClass 对象的大小是0x68,我想要一个0x20数组。所以总大小是 sizeof(MyClass( * 0x20 = 0xD00,或者我是这么认为的。
现在当我使用我的重载放置 new[] 运算符时:
pArr = new(pAllocatedMem)MyClass[0x20];
返回size_t给 new[] 运算符的编译器实际上是0xD08。还有一个额外的 8 个字节。查看这 8 个字节的值,它用于存储数组的大小(在本例中为 0x20(。
那么,对于这个标头大小是否有一个恒定的定义,比如从 WDK 中,我可以使用它?此大小的变化取决于编译器还是其他什么?
该额外空间量(如果有(取决于编译器。 关于语言定义[新译,第15段]:
[It] 是一个非负的未指定值,表示数组分配开销;new-表达式的结果将从运算符 new[] 返回的值中偏移此量。
运行时通常使用它来了解最终在数组上调用delete
时要销毁多少对象。
我自己补充答案。和同事做了一个小测试。如果要初始化的类具有定义的析构函数,则 VS 编译器将需要存储数组大小的开销。没有析构函数,没有开销。这是一个错误还是一个功能?!.
#include <malloc.h>
#include <new>
class Foo
{
public:
//Foo() {}
//~Foo() {} // <-- will cause overhead even with user-allocated memory passed to placement new()
int a;
};
int main()
{
int n = 0x10;
size_t size = sizeof(int) * 2 + sizeof(Foo) * n;
void* p = malloc(size);
*((int*)p) = 0xaaaaaaaa;
*(int*)((char*)p + size - sizeof(int)) = 0xbbbbbbbb;
// Placement new with user-allocated memory
Foo* pf = new ((char*)p + sizeof(int)) Foo[n];
for (int i = 0; i < n; i++)
{
pf[i].a = i;
}
free(p);
return 0;
}
相关文章:
- 以天C++为单位的两个时间戳之间的差异
- 如何以毫秒为单位获取开始时间和 now() 之间的毫秒差异(以 C++为单位?
- 从原始字节解码协议缓冲区(以 C++为单位)
- 如何在 c++ 中确定一条指令(以字节为单位)在哪里结束,另一条指令从哪里开始?
- 编写以 C++ 为单位返回值的函数
- 以C++为单位进行运行长度编码
- 如何找到两个日期之间的时间差异(以秒和纳秒为单位)?
- arr[n] 是否以 C++ 为单位打印数组的长度?
- 字符串数组上的 sizeof 运算符以 C++ 为单位给出不同的输出
- 以 C++ 为单位具有输出限制的排列
- 以 GDB 为单位指定浮点精度
- 整数数据如何以位为单位存储在内存中?不是右对齐吗?
- 如何在没有硬编码的情况下以C++为单位获取类数组的长度?
- 指针引用的生存期(以 C++为单位)
- 以字符为单位设置控制台大小
- 获取嵌套 stl 容器的大小(以字节为单位)
- 有没有一种 STL 方法可以找到字符串的所有排列,给出一个以 C++ 为单位的大小?
- 二进制数组中最大连续 1 的起始和结束索引,以 C++ 为单位
- 正向声明的枚举,默认值以.h为单位
- 常量"C"占用的空间(以字节为单位)