C++ 为什么我应该使用1位字段而不是布尔值?

C++ 为什么我应该使用1位字段而不是布尔值?,c++,unreal-engine4,C++,Unreal Engine4,上面的代码来自UE4。它们似乎使用uint32一位位字段而不是布尔值。他们为什么这样做?一个独立的bool至少有一个字节长。处理器不能处理较小的单元。然而,我们都知道一个字节可以容纳8位/布尔,所以如果您有一个具有多个布尔的数据结构,那么每个布尔不需要一个字节。它们可以共享一个字节。如果你有很多这样的结构,它可能会节省一些内存。我想这是为了节省空间。bool不使用一位,所以如果它们包含4个以上的变量,它们就会获得一些空间。UE4是一个现代引擎。内存节约在现代系统中是否至关重要?然而,访问位字段通

上面的代码来自UE4。它们似乎使用uint32一位位字段而不是布尔值。他们为什么这样做?

一个独立的
bool
至少有一个字节长。处理器不能处理较小的单元。然而,我们都知道一个字节可以容纳8位/布尔,所以如果您有一个具有多个布尔的数据结构,那么每个布尔不需要一个字节。它们可以共享一个字节。如果你有很多这样的结构,它可能会节省一些内存。

我想这是为了节省空间。
bool
不使用一位,所以如果它们包含4个以上的变量,它们就会获得一些空间。UE4是一个现代引擎。内存节约在现代系统中是否至关重要?然而,访问位字段通常速度较慢,并且不能以原子方式完成(例如,对于多线程应用程序),这是事实。我猜开发人员发现这段代码中的优点比缺点更有用,也许其他人会在另一段代码中对其进行不同的加权。@BasileStarynkevitch原子位域访问可以在某些体系结构上实现
amd64
可能不支持此操作,但
armv6
支持原子读取。
UCLASS(abstract, config=Game, BlueprintType, hidecategories=("Pawn|Character|InternalEvents"))
class ENGINE_API ACharacter : public APawn
{
    GENERATED_UCLASS_BODY() 
...
    UPROPERTY(Transient)
    uint32 bClientWasFalling:1; 

    /** If server disagrees with root motion track position, client has to resimulate root motion from last AckedMove. */
    UPROPERTY(Transient)
    uint32 bClientResimulateRootMotion:1;

    /** Disable simulated gravity (set when character encroaches geometry on client, to keep him from falling through floors) */
    UPROPERTY()
    uint32 bSimGravityDisabled:1;

    /** 
     * Jump key Held Time.
     * This is the time that the player has held the jump key, in seconds.
     */
    UPROPERTY(Transient, BlueprintReadOnly, VisibleInstanceOnly, Category=Character)
    float JumpKeyHoldTime;