为什么我应该使用1位位域而不是布尔?

Mai*_*ein 3 c++ unreal-engine4

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;
Run Code Online (Sandbox Code Playgroud)

上面的代码来自UE4.他们似乎使用uint32一位bitfield而不是bools.他们为什么要这样做?

nvo*_*igt 8

独立bool的至少一个字节长.处理器无法处理较小的单元.但是,我们都知道一个字节可以容纳8位/ bool,所以如果你有一个包含多个bool的数据结构,那么每个字节都不需要一个字节.他们可以共享一个字节.如果你有很多这样的结构,它可能会节省一些内存.

  • 但是访问位域通常较慢,并且无法以原子方式完成(例如,对于多线程应用程序) (4认同)
  • @BasileStarynkevitch可以在某些体系结构上实现原子位域访问.`amd64`可能不支持这个,但`armv6`支持原子读取. (2认同)