如何让Visual Studio 2022在Release构建中初始化整个结构体?
问题背景
给定结构体:
typedef struct foo_s { uint32_t a; bool b; } foo;
Visual Studio 2022为该结构体分配8字节存储空间,尽管bool类型仅占1字节。以下代码在Debug构建中返回true,但在Release构建中返回false:
bool Compare( void ) { foo f1 = { 3, true }; foo f2 = { 3, true }; return memcmp( &f1, &f2, sizeof( foo ) ) == 0 ? true : false; }
原因很明确:Debug模式下编译器会将foo的全部8字节清零,而Release模式下出于性能优化不会这么做,结构体预留的8字节中最后3字节是栈上未初始化的垃圾数据。
提问
是否有办法让编译器在Release构建中初始化整个结构体?此代码以C++编译。
已排除的方案(不符合需求)
- 方案1:
bool Compare( void ) { foo f1 = { 0 }; f1.a = 3; f1.b = true; foo f2 = { 0 }; f2.a = 3; f2.b = true; return memcmp( &f1, &f2, sizeof( foo ) ) == 0 ? true : false; }
- 方案2:
bool Compare( void ) { foo f1; memset( &f1, 0, sizeof( foo ) ); f1.a = 3; f1.b = true; foo f2; memset( &f2, 0, sizeof( foo ) ); f2.a = 3; f2.b = true; return memcmp( &f1, &f2, sizeof( foo ) ) == 0 ? true : false; }
内容的提问来源于stack exchange,提问作者F.V. Petrov
相关产品推荐
相关产品推荐

