位段和联合体的内存分配及大小计算

news/2024/11/8 6:43:09/

目录

一、位段

二、联合体


一、位段

位段一次开辟1或4个字节的空间,不够再继续开辟。
struct A {int a : 2;int b : 5;int c : 10;int d : 30;
};

int a : 2;        给a分配两个byte的内存空间

因为a的参数类型为int,一次开辟4个字节

a占2byte,b占5byte,c占10byte,d占30byte

因为a、b、c总共占了17个byte,剩下的内存大小为4*8-17=15<30,舍弃掉这15个字节

int d时再开辟4个字节的空间

所以struct A的大小为8字节

struct B {char a:3;char b:4;char c:5;char d:4;
};

char a : 2;        给a配3个byte

因为是char类型所以一次开辟1个字节

sizeof(struct B)= 3

二、联合体

        联合体中的成员共用一块空间
        联合的大小至少是最大成员的大小。
        当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。

union Un
{int i;char c;
};
union Un un;int main() {printf("%d\n", &(un.i));printf("%d\n", &(un.c));un.i = 0x11223344;un.c = 0x55;printf("%x\n", un.i);return 0;
}

运行代码我们可以看到,un.i和un.c的地址是一样的,证明两个成员确实共用了一块内存空间

而且由于vs是小端存储,一开始un.i=0x11223344把内存改为了44 33 22 11,之后un.c=0x55把内存改为55 33 22 11,输出结果为11223355

接下来再看联合体的大小

union Un1
{char c[5];int i;
};
union Un2
{short c[7];int i;
};

对Un1,虽然c占5个字节,i占4个字节,但是当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。c是最大成员,其对齐数为1,i的对齐数为4,所以要对齐到4的整数倍8,Un1的大小就为8个字节

对Un2,c占14个字节,i占4个字节,c是最大成员,其对齐数为2,i的对齐数为4,所以要对其到4的整数倍16,Un1的大小就为16个字节


http://www.ppmy.cn/news/241125.html

相关文章

STL中的内存分配方式

转自(http://www.cnblogs.com/LUO77/p/5824625.html) 在STL中考虑到小型区块所可能造成的内存碎片问题&#xff0c;SGI STL设计了双层级配置器&#xff0c;第一级配置器直接使用malloc()和free();第二级配置器则视情况采用不同的策略&#xff1a;当配置区块超过128bytes 时&am…

S32K144内存分配

本文将通过实际的工程代码介绍NXP S32K144单片机变量地址分配&#xff0c;应用笔记仅用于自己学习及大家参考。 示例代码如下&#xff1a; uint8_t num_byte[4]; uint32_t num_word; const uint32_t num_word_const 0x1234; uint32_t *point_heap; int main(void) { uint8_t…

内存管理(一)——内存分配

前言 我们都知道&#xff0c;计算机工作的过程概括起来就是 CPU 去内存中读取指令并执行的过程&#xff0c;但是如果运行我们的程序直接操作物理内存&#xff0c;将会引发很多的问题&#xff08;比如不同进程之间访问/修改的隔离、权限等等&#xff09;&#xff0c;所以爱操心…

DDR3地址及容量大小

DDR3 地址线 DDR3为减少地址线&#xff0c;把地址线分为行地址线和列地址线&#xff0c;在硬件上是同一组地址线&#xff1b;地址线和列地址线是分时复用的&#xff0c;即地址要分两次送出&#xff0c;先送出行地址&#xff0c;再送出列地址。 一般来说列地址线是10位&a…

STM32——根据地址计算存储空间的大小

首先要知道 1MB1024KB 1KB1024Byte 1Byte8bit 存储空间大小结束地址-起始地址1&#xff08;用十进制来算&#xff0c;得到结果的单位是Byte&#xff09; 十六进制与2进制转换表 十六进制2进制00000100012001030011401005010160110701118100091001A&#xff08;10&#xf…

STL六大组件之——分配器(内存分配,好深奥的东西)

SGI设计了双层级配置器&#xff0c;第一级配置器直接使用malloc()和free()&#xff0c;第二级配置器则视情况采用不同的策略&#xff1a;当配置区块超过128bytes时&#xff0c;视之为“足够大”&#xff0c;便调用第一级配置器&#xff1b;当配置区小于128bytes时&#xff0c;视…

kmalloc分配大小的限制

原文地址&#xff1a;http://linux.chinaunix.net/techdoc/net/2009/04/28/1109237.shtml #################################################################################################################################### kmalloc是通过cache来实现的, 只不过每次…

采用链接分配方式进行外存分配时,可采用的两种形式及其特点。假定磁盘块大小为4K,对于128G的硬盘,其文件分配表FAT需占用多少存储空间?

采用链接分配方式进行外存分配时&#xff0c;可采用的两种形式及其特点。假定磁盘块大小为4K&#xff0c;对于128G的硬盘&#xff0c;其文件分配表FAT需占用多少存储空间&#xff1f; 隐式链接&#xff1a;除文件的最后一个盘快外&#xff0c;每个盘快中都存有指向下一个盘快的…