C++位域成员变量初始化值(UE4例子)
C++ bit field member variable initialization value (UE4 example)
我想知道如果未显式初始化位域 class 成员变量会有什么值。
使用 unreal engine 4.27 中的示例:
//member variable of UPrimitiveComponent
//there are other uint8 bitfields declared above and below this
UPROPERTY(...some UE4 macro stuff...)
uint8 bCastHiddenShadow:1;
没有在头文件、构造函数成员初始化列表或构造函数体中显式初始化。然而它似乎被初始化为 0 罚款。对于非位域变量,我认为这将是未定义的行为,但我认为这里不是这种情况?或者该值是否取决于附近打包位域变量的初始化(其中一些是显式初始化的)?
(或者,不确定 UPROPERTY 宏是否以某种方式对它进行初始化?抱歉,无法在任何地方找到该宏的完整定义)
挖得更深一点,所以我会尝试自己回答这个问题。我相信对于普通的 C++ class 这将是未定义的行为,因为我找不到任何关于 bit-fields 的信息。
对于 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
,然后调用 FMemory::Memzero
,最终使用 [=16] =] 将内存归零
我想知道如果未显式初始化位域 class 成员变量会有什么值。
使用 unreal engine 4.27 中的示例:
//member variable of UPrimitiveComponent
//there are other uint8 bitfields declared above and below this
UPROPERTY(...some UE4 macro stuff...)
uint8 bCastHiddenShadow:1;
没有在头文件、构造函数成员初始化列表或构造函数体中显式初始化。然而它似乎被初始化为 0 罚款。对于非位域变量,我认为这将是未定义的行为,但我认为这里不是这种情况?或者该值是否取决于附近打包位域变量的初始化(其中一些是显式初始化的)?
(或者,不确定 UPROPERTY 宏是否以某种方式对它进行初始化?抱歉,无法在任何地方找到该宏的完整定义)
挖得更深一点,所以我会尝试自己回答这个问题。我相信对于普通的 C++ class 这将是未定义的行为,因为我找不到任何关于 bit-fields 的信息。
对于 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
,然后调用 FMemory::Memzero
,最终使用 [=16] =] 将内存归零