C++位域成员变量初始化值(UE4示例)

标签 c++ initialization unreal-engine4 bit-fields

我想知道如果未显式初始化,位字段类成员变量将具有什么值。

使用虚幻引擎 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.

https://docs.unrealengine.com/4.27/en-US/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/Objects/Optimizations/

在代码中,这将在 UObjectGlobals.cpp 中的 StaticAllocateObject 中发生,内存先于 malloc'd,然后是 FMemory::Memzero 被调用,最终使用 memset 将内存归零

关于C++位域成员变量初始化值(UE4示例),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70789891/

相关文章:

c++ - 是否可以将 gcc 的链接器与 dlopen 结合使用?

C++ 全局变量初始化顺序

java - "Variable might not have been initialized"是什么意思?

C:动态分配时通过引用传递

c++ - 数组仅在第一次返回错误值

c++ - 在 3D 环境中识别模式

c++ - fatal error C1001 : An internal error (compiler file 'msc1.cpp' , 第 1518 行)与 vs2017 15.8.4

c++ - 如何使用 Node C++ 插件部署动态库?

c++ - BinarySearch 返回它所属位置的索引

c++ - 异步代理和窗口消息