在C99标准中,对于内存对齐的细节没有作过多的描述,具体的实现交由编译器去处理,所以在不同的编译环境下,内存对齐可能略有不同,但是对齐的最基本原则是一致的,对于结构体的字节对齐主要有下面两点:

  1. 结构体每个成员相对结构体首地址的偏移量(offset)是对齐参数的整 数倍,如有需要会在成员之间填充字节。编译器在为结构体成员开辟空间时,首先检查预开辟空间的地址相对于结构体首地址的偏移量是否为对齐参数的整数倍,若是,则存放该成员;若不是,则填充若干字节,以达到整数倍的要求。这句话中的对齐参数是取每个变量自身对齐参数和系统默认对齐参数#pragma pack(n)中较小的一个。举个简单的例子,比如在结构体A中有变量int a,a的自身对齐参数为4(环境为windows/DEV),而DEV默认的对齐参数为8,取较小者,则对于a,它相对于结构体A的起始地址的偏移量必须是4的倍数。

  2. 结构体变量所占空间的大小是对齐参数大小的整数倍。如有需要会在最后一个成员末尾填充若干字节使得所占空间大小是对齐参数大小的整数倍。它是取结构体中所有变量的对齐参数的最大值和系统默认对齐参数#pragma pack(n)比较,较小者作为对齐参数。

(1)struct结构体变量大小等于结构体中的各个成员变量所占内存大小总和,union共用体变量大小等于共用体结构中占用内存最大的成员的内存大小; 联合体中占用内存空间最大的字段加上填充字节(对齐字节后所需字节数)。

(2)枚举类型,指一个被命名的整型常数的集合。即枚举类型,本质上是一组常数的集合体,只是这些常数有各自的命名。枚举类型,是一种用户自定义数据类型,一般是int数据类型,4个字节。

枚举变量,由枚举类型定义的变量。枚举变量的大小,即枚举类型所占内存的大小。由于枚举变量的赋值,一次只能存放枚举结构中的某个常数。所以枚举变量的大小,实质是常数所占内存空间的大小(常数为int类型,当前主流的编译器中一般是32位机器和64位机器中int型都是4个字节),枚举类型所占内存大小也是这样。

(3)指针其实就是地址, 与它所指的基类型无关, 更与C语言无关, 只与机器有关. 如果你的机器是16位寻址的, 那指针就是16位的,2个字节, 如果是32位寻址的, 指针也是32位的,4个字节.如果寻址是64位的,指针也是64位,8个字节。

看例题:

首先,#pragma pack(2)   强制设定为2字节对

i   4字节

u  一个为13,一个为4,默认为4字节对齐;

但是,该处强制为2字节对齐,实际为13+1=2*7=14字节

color   枚举类型的实例  4字节

4+14+4=22字节

C++中结构体中普通成员函数不占用类得内存。
但是如果有虚函数的话,要有一个虚表指针的内存
类最小是占用一个字节。即一个没有任何成员变量和虚函数的类占用1字节

声明是对一个变量的性质加以说明,并不为其分配存储空间。

函数(子程序)里声明的变量即局部变量,只用当调用子程序时才分配,退出子程序就取消。

主程序中声明变量时,如int i;float a【10】,声明的同时也就分配。

2、

typedef struct

{ char c;

short d;

static int a; }

C;

sizeof(C)= 4

正因为我们的a是静态变量,而静态数据成员的存放位置与结构体实例的存储地址无关(注意只有在C++中结构体中才能含有静态数据成员,而C中结构体中是不允许含有静态数据成员的)。a是单独存放在静态数据区的,因此用siezof计算其大小时没有将a所占的空间计算进来。

C 语言中结构体中成员所占内存的大小相关推荐

  1. C语言:结构体中一级指针和二级指针的创建与释放示例

    http://blog.csdn.net/Bixiwen_liu/article/details/53610952 这几天把C语言巩固了一下,作为一门最基本的编程语言,C语言还是相当基础和非常重要的, ...

  2. c语言结构体定义字符串数组,C语言,结构体中字符串的声明(采用字符指针还是字符数组)...

    结构体中,字符串选项是用字符数组表示好,还是用字符指针表示好? typedef struct person{ char *name; int age; char sex[6]; }: 该结构体中nam ...

  3. c语言常量结构体的成员,c语言之结构体

    c语言之结构体 1.结构体基础知识 C语言提供了两种类型的聚合数据类型(能够同时存储超过一个的单独数据),数组和结构.数则是相同类型的元素的集合,而结构也是一些值的集合,这些值称为它的成员,单一个结构 ...

  4. golang语法系列3-Go语言初始化结构体的成员变量

    1.使用"键值对" 初始化结构体 1.1.键值对初始化结构体的书写格式 键值对初始化的格式如下: ins:= 结构体类型名{字段1:字段1的值,字段2:字段2的值,... } 结构 ...

  5. go结构体初始化_Go语言初始化结构体的成员变量

    结构体在实例化时可以直接对成员变量进行初始化,初始化有两种形式分别是以字段"键值对"形式和多个值的列表形式,键值对形式的初始化适合选择性填充字段较多的结构体,多个值的列表形式适合填 ...

  6. 【C 语言】结构体 ( 指针运算与指针内存操作 | 结构体成员偏移量计算 )

    文章目录 一.指针运算 与 指针内存操作 二.结构体偏移量计算 一.指针运算 与 指针内存操作 指针变量算术运算 ( 指针可以是任意值 ) : 指针 是一个变量 , 如果对指针进行 算术 / 逻辑 等 ...

  7. c语言字符数组赋值_C语言关于结构体字符成员元素赋值的方法

    C语言部分有些容易忘记的内容,这样贴在这里方便大家学习和查阅 本章节里面有结构体和数组长度的问题. 欢迎大家来点评 #include #include //结构体 struct student{ in ...

  8. C++57个入门知识点_17 类的访问权限及C语言模拟类的封装(类的私有权限突破方法:编译期进行权限检查,运行期通过指针修改类的私有成员变量;利用函数指针对结构体中成员变量进行修改;CPU大小尾排列)

    接上篇:C++57个入门知识点_16 类的标准写法(类名.成员变量.成员函数及对象命名规则:成员变量一般为私有,成员函数为公有并暴露给外部使用成员变量:防止类过大,声明写在.h,实现写在.cpp,调用 ...

  9. c语言的结构体能存放函数吗,在C语言结构体中添加成员函数

    我们在使用C语言的结构体时,经常都是只定义几个成员变量,而学过面向对象的人应该知道,我们定义类时,不只是定义了成员变量,还定义了成员方法,而类的结构和结构体非常的相似,所以,为什么不想想如何在C语言结 ...

  10. 结构体自定义指针函数c语言,C语言结构体中的函数指针

    C语言结构体中的函数指针 C语言结构体中的函数指针内容由小编收集整理,希望对您的 学习有所帮助!更多内容请关注应届毕业生考试网! 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合.所以,标准 ...

最新文章

  1. [转自scott]ASP.NET MVC框架 (第二部分): URL路径选择
  2. Makefile: -I(大写i)、-L、-l
  3. linux服务器防cc攻击工具,宝塔linux面板
  4. 2016年3月1日Android实习笔记
  5. POJ 3694 Network
  6. shell中执行某条语句失败能不能重复执行_如何理解Mysql中的事务隔离级别?
  7. sqlserver调用msxml3.dll中的xmlhttp对象
  8. Netty工作笔记0075---handler链调用机制实例1
  9. python编程(pdb调试)
  10. 前端取色器 FSCapture
  11. 《如何写好科研论文》章节答案(清华)学堂在线(2020秋最新网课答案)
  12. 领导给你安排任务,这三种话,越早说越好
  13. CSDN浏览器助手又双叒叕更新啦,来体验下都更新了什么
  14. 为什么用于开关电源的开关管一般用MOS管而不是三极管
  15. C语言:str函数(一)
  16. Redis删除键命令: 入门用del,老手用unlink,有何区别?
  17. 待办事项桌面_Win干货 | 电脑桌面清单助手
  18. 科学计算机可以带上飞机吗,笔记本电脑可以随身带上飞机吗
  19. 推荐一个很不错的桌面便笺工具magic notes
  20. 分享马化腾在3Q大战后写给腾讯全体员工的一封信

热门文章

  1. 单片机加减法C语言,如何利用51单片机实现加减法计算
  2. 十进制 二进制 十六进制 八进制
  3. Oracle用户、身份、数据类型、和mysql的区别
  4. **一些常用的字体英文名**
  5. 海思3518E开发笔记1.2——海思SDK脚本学习
  6. 【将金令】炒白银,切忌!切忌!
  7. STM32 AD采样基准电压
  8. 电子设计教程6:TL431基准电压芯片的原理与典型应用
  9. win7如何启用计算机的无线功能,Win7电脑如何设置WiFi?设置WiFi的方法
  10. 云计算实训总结_云计算·实训报告书