c——汇编角度理解类型定义 对象定义

来源:互联网 发布:如何破解软件试用期 编辑:程序博客网 时间:2024/05/29 09:12

c语言

类型定义

类型定义是model,描述对象在内存中的存储结构,用来辅助编译器在编译期生成目标代码,一旦编译完成,生成目标代码,类型就被discard,不复存在,类型不占据内存空间,学过汇编知道,目标代码中没有任何类型的存在痕迹,汇编代码是无类型的
自定义类型与内置类型无本质区别
  • 内置类型可理解为语言预定义的自定义类型,而自定义类型为开发者定义的内置类型
  • 内置类型可理解为每个文件(头文件或源文件)预包含(#include)内置类型的类型信息,而自定义类型需开发者包含(#include)自定义类型的类型信息
因此类型定义为文件作用域,每个文件(头文件或源文件)要使用自定义类型需包含(#include)自定义类型的类型信息
同一文件(头文件或源文件)不能多次包含(#include)同一自定义类型的定义,否则编译器不知道使用哪个,重定义error

对象定义

对象定义是对物理内存的逻辑抽象,对象是一块命名的物理内存,其字长跟对象类型相关

汇编语言

学过汇编知道,汇编的核心就是对内存的操作,包括内存分配,内存寻址,内存访问(读写内存)
  • 内存分配:分配多大空间内存
  • 内存寻址:找到内存访问起始地址
  • 内存访问:读写多少字节长度的内存
类型分类单一成员/多成员类型对象内存分配内存寻址内存访问内置类型单一成员intisizeof(int)&isizeof(i)enum类型单一成员enum EColorcolorsizeof(enum EColor)&colorsizeof(color)指针类型单一成员int*pisizeof(int*)(指针类型字长都一样)&pisizeof(pi)数组类型多成员int[3]arrsizeof(int[3])(int*)&arr + offset数组成员字长,数组成员类型相同,即字长相同struct类型多成员struct Animalanimalsizeof(struct Animal)&animal + offsetstruct成员字长,struct成员类型不同,即字长不同union类型多成员union Animalanimalsizeof(union Animal)&animal(offset为0)union成员字长,union成员类型不同,即字长不同函数类型单一成员void (int, int)feed-void (*)(int, int)&feed-
解释:
  • 数组类型的成员类型相同,因此第n个数组成员的内存寻址为(int*)&arr + n * sizeof(int),内存访问长度为sizeof(int),数组成员类型为int
  • struct类型的成员类型不同,因此struct类型定义时每个成员保存了该成员相对于struct首地址的offset和成员类型字长,注意struct内存对齐
  • union类型的成员类型不同,因此union类型定义时每个成员保存了该成员相对于union首地址的offset和成员类型字长,注意union内存对齐,但union是一种特殊struct,其每个成员相对于union首地址的offset均为0
0 0