引子:兜兜转转还是你~
C++数据类型
int 占用 4 个字节(32 位机)
char 占用 1 个字节(8 位机)
short 占用 2 个字节(16 位机)
long 占用 4 个字节(32 位机)
float 占用 4 个字节(32 位机)
double 占用 8 个字节(64 位机)
long double 占用 16 个字节(64 位机)
define 和 const 的区别
define 在编译预处理过程中把所有的符号常量替换为所指定的字符序列,它没有类型,在内存中并不存在以符号常量为名的存储单元,它只是简单的字符串替换,因此它没有数据类型,也就没有存储单元。
const 具有变量的特征,它有数据类型,需要占用存储单元,存储单元中存放的是不可变的常量值。
结构体内存对齐
struct S1
{
char a;
int b;
char c;
} s1;
struct S2
{
char a;
char c;
int b;
} s2;
sizeof(s1)=12, sizeof(s2)=8
结构体默认的字节对齐一般满足以下三点:
1、结构体变量的首地址能够被其最宽基本类型的成员变量整除
2、结构体每个成员相对于结构体首地址的偏移量是该成员类型大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal alignment)。
3、结构体总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing alignment)。
C++程序是如何运行的
C++程序从编写完成到生成可执行文件(exe)需要经过以下几个阶段:
预处理(Preprocessing):预处理器负责处理源代码中的预处理指令,如#include、#define 和#if 等。预处理器将替换源代码中的宏定义和条件编译,生成一个预处理后的源文件(通常为.i 文件)。
编译(Compilation):编译器将预处理后的源文件转换为目标代码,通常是汇编代码(.s 文件)或者机器代码。在这个过程中,编译器会检查语法错误并对代码进行优化。
汇编(Assembly):汇编器将编译器生成的汇编代码转换成目标代码文件(通常是.obj 或.o 文件)。目标代码文件中包含了程序的机器指令、符号表(用于后续链接)以及重定位信息(如全局变量的地址)。
链接(Linking):链接器负责将一个或多个目标代码文件连接成一个可执行文件(如.exe 或.elf)。在这个过程中,链接器会解析符号表并处理外部引用,将不同的目标代码文件中的同名符号合并,还会将执行环境(如 C 运行时库)所需的代码和数据添加进可执行文件。
加载(Loading):当运行可执行文件时,加载器会将可执行文件从磁盘加载到内存中,并为其分配运行时资源,如内存和文件描述符。接着,操作系统将控制权交给程序入口点(main 函数),程序开始执行。