您的位置:首页 > 编程语言 > C语言/C++

C语言结构体对齐、枚举、宏、联合体

2020-08-30 15:30 1241 查看

C语言结构体对齐、枚举、宏、联合体

结构体对齐问题

关于结构体对齐问题请阅读:结构体对齐规则及举例

系统指定类型的大小与系统有关,这里取

数据类型 字节
char 1
float 4
double 8
long double 16
short int 2
int 4
long int 8
long long int 8

(1)按结构体最大成员对齐(32位机下double、long long按照4字节对齐)
案例一:

struct A{
char a;
short b;
int a;
};

结果是8

案例二:

struct A{
int a;
double b;
};

结果是12并非16

(2)结构体嵌套
嵌套的结构体会在先内部完成对齐。
案例一:

struct A{
short a;
char b;
};
struct B{
struct A b;
char c;
int d;
};

结果是12,而非8
如果是:
案例二:

struct A{
short a;
char b;
char c;
int d;
};

则是8

(3)每个成员的起始位置必须是当前成员大小的整数倍
例如:

  • short的起始位置必须是2的倍数。
  • int、long long、double的起始位置必须是4的倍数。
  • char则随便放,因为是1。
struct A{
char a;
short b;
int c;
};

b的偏移是2而非1

(4)在使用预编译指令指定对齐方式之后,一切听预编译指令
#pragma pack(nbytes)可以指定按nbytes字节对齐。

枚举常量与宏的区别

  • 枚举常量属于常量,但宏不是常量;
  • 枚举常量具有类型,但宏没有类型,枚举变量具有与普通变量相同的诸如作用域、值等性质,但宏没有,宏不是语言的一部分,它是一种预处理替换符。枚举类型主要用于限制性输入,例如,某个函数的某参数只接受某种类型中的有限个数值,除此之外的其它数值都不接受,这时候枚举能很好地解决这个问题。能用枚举尽量用枚举,否则在调试的时候你是看不到当时的值的。
  • 枚举可以一次定义大量相关的常量,而#define 宏一次只能定义一个。

联合体和结构体区别

两者都可以有多个成员,结构体是多个不同类型变量的组合,其占用的内存大小是所有变量大小的总和; 联合体多个不同类型的变量占用一份存储空间,其占用内存的大小是联合体中最大的那个变量的大小。

由于共用一份存储空间,所以对联合体的成员进行修改会顺带改变其他成员,结构体则不会。

C和C++结构体区别

  • C的结构体内不允许有函数成员存在,C++允许有内部成员函数。所以C的结构体是没有构造函数、析构函数、和this指针的。
  • C的结构体对内部成员变量的访问权限只能是public,而C++允许public,protected,private三种。
  • C语言的结构体是不可以继承的,C++的结构体是可以从其他的结构体或者类继承过来的。
  • 创建结构体对象的书写不同,C++直接用结构体名 变量名;而C要struct 结构体名 变量名;
  • C结构体不可以有static成员。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: