当涉及填充时,堆的MSVC初始化
MSVC initialization of heap when padding is involved
MSVC内存管理器具有某些十六进制代码,它在调试构建中根据执行的操作标记内存。
特别地,代码0xCDCDCDCD用于标记已分配但未初始化的堆内存。假设我有以下结构:
struct Test
{
bool foo;
int value;
Test() : foo(false), value(0) {}
};
当我分配这个对象时,我的内存看起来像这样吗(请注意,我正在写十六进制字节,因为它们会按顺序出现,在这个例子中没有考虑到端进制)?
00 CD CD CD CD 00 00 00 00
上面,00 CD CD CD
表示4字节对齐的布尔值。最后3个字节是0xCD
,因为内存管理器将这些值初始化为CD,但是该结构中的布尔值的实际初始化仅触及1字节,因为布尔值在我的机器上仅表示1字节。
试试吧。确保使用/MDd
或类似的工具进行编译,以链接到调试运行时。(答案是肯定的VS2010)。
如果生成更快的代码,没有什么可以阻止代码生成器写入4字节。或者使用memset(),这是MSVC编译器中常见的优化方法。但这显然没有发生。无论哪种方式都是正确的,读取结构填充是未定义的行为。
相关文章:
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 有与__builtin__FUNCTION()等效的MSVC吗
- C++关于指针和使用函数将它们启动到堆的行为究竟是什么?
- CMake 生成的 MSVC 项目找不到符号,即使为其相关 dll 正确生成了 lib 文件也是如此
- priority_queue使用降序向量实现最小堆的语法差异
- 使用堆的优先级队列,具有相同键的值不遵循 FIFO(先进先出)
- -fno-char8_t 的 MSVC 等效值是多少?
- 在没有堆的情况下用两种方法构造对象
- 从模板继承的 MSVC DLL 导出类会导致LNK2005已定义的错误
- 使用读取[EBP 4]的MSVC内联ASM移植到64位
- 为什么静态局部变量的 MSVC 线程安全初始化使用 TLS
- 在 C++ 中,映射相对于堆的优势是什么?
- 静态常量 std::<char>没有堆的向量初始化?
- 如何求解与GCC/Clang不同的C 功能模板的MSVC处理(无法识别的模板定义)
- 如何使用x86-32的MSVC++获得高效的asm来调零微小结构
- 堆的分配和分裂
- 使用堆的优先级队列
- 是否可以实施中位数的中位数intreselect而没有掉期或堆的分配
- 指向模板参数中重载函数的MSVC指针
- 当涉及填充时,堆的MSVC初始化