windows下变量的内存布局

今天调试颜色值得时候,发现了一个超出我认知常理的事情。

请看如下代码

union TestUnion
{
    struct
    {
        uint8_t b;
        uint8_t g;
        uint8_t r;
        uint8_t a;
    };

    uint32_t rgba;
};

 

int main()
{

    int intData = (1 << 24) | (2 << 16) | (3 << 8) | 4;

    TestUnion* testUnion = (TestUnion*)(&intData);
    std::cout << testUnion->b << " " << testUnion->g << " " << testUnion->r << " " << testUnion->a;

    system("pause");
    return 0;

}

 

最终输出的结果是是4 3 2 1

经过考虑

强行解释一波

栈从上往下分配内存,所以4在低位,1在高位,对应到联合体里面,b是低位,a是高位,所以b是4,a是1。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Windows系统中,内存布局可以分为以下几个部分: 1. 内核空间(Kernel Space):这是操作系统内核和驱动程序所使用的内存空间。它的大小通常为2GB或更高,这取决于Windows系统的版本和配置。在这个空间中,内核可以直接访问硬件和其他资源。 2. 用户空间(User Space):这是用户进程所使用的内存空间。它通常占据了进程地址空间的大部分,并由虚拟内存机制管理。在这个空间中,用户进程可以访问自己的代码和数据,以及共享库和系统资源等。 3. 内存映射文件(Mapped Files):这是一种特殊的内存映射,它将文件映射到进程的地址空间中。这使得进程可以像访问内存一样访问文件内容。在Windows系统中,内存映射文件通常用于实现共享内存区域和动态链接库等。 4. 堆(Heap):这是一个动态分配的内存区域,用于进程中的动态数据结构和变量。在Windows系统中,堆由Heap Manager管理,支持动态分配和释放内存,以及内存池和垃圾收集等。 5. 栈(Stack):这是用于函数调用和局部变量的一种内存区域。在Windows系统中,每个线程都有自己的栈,用于存储函数参数、返回地址和局部变量等。 6. 内存管理结构(Memory Management Structures):这是Windows系统用于管理内存的数据结构和算法。包括虚拟内存管理机制、页面替换算法、内存分配器、进程内存管理和系统内存管理等。 在Windows系统中,内存布局的具体实现会根据系统版本、硬件配置和应用程序需求等因素而有所不同。但以上这些部分通常都是包含在内存布局中的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值