我想知道如果未显式初始化,位字段类成员变量将具有什么值。
使用虚幻引擎 4.27 中的示例:
//member variable of UPrimitiveComponent
//there are other uint8 bitfields declared above and below this
UPROPERTY(...some UE4 macro stuff...)
uint8 bCastHiddenShadow:1;
它没有在 header 、构造函数成员初始值设定项列表或构造函数主体中显式初始化。但它似乎被初始化为 0 很好。对于非位域变量,我认为这将是未定义的行为,但我认为这里不是这种情况?或者该值是否取决于附近打包位域变量的初始化(其中一些是显式初始化的)?
(或者,不确定 UPROPERTY 宏是否以某种方式进行了一些魔法来初始化它?抱歉,在任何地方都找不到该宏的完整定义)
最佳答案
挖得更深一点,所以我会尝试自己回答这个问题。我相信对于普通的 C++ 类来说,这将是未定义的行为,因为我找不到任何专门针对位字段建议的信息。
对于 UE4 示例,引擎中的大多数对象(包括引用的 UPrimitiveComponent
示例)均派生自 UObject
,而且我确实在文档深处发现这些对象自动为零初始化:
Automatic Property Initialization UObjects are automatically zeroed on initialization, before the constructor is called. This happens for the whole class, UProperties and native members alike. Members can subsequently be initialized with custom values in the class constructor.
在代码中,这将在 UObjectGlobals.cpp
中的 StaticAllocateObject
中发生,内存先于 malloc
'd,然后是 FMemory::Memzero
被调用,最终使用 memset
将内存归零
关于C++位域成员变量初始化值(UE4示例),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70789891/