本章主要记录一下C/C++基础方面的一些内容,以备后续查验。
1. 类的大小
参看如下代码test.cpp:
编译运行:
[root@localhost test-src]# gcc -o test test.cpp -lstdc++
[root@localhost test-src]# ./test
sizeof(int): 4
sizeof(intprt_t): 8
sizeof(void *): 8
sizeA: 1
sizeB: 4
sizeC: 1
sizeD: 8
sizeE: 1
sizeF: 8
2. 基本数据类型大小
64bit操作系统:
编译运行:
# gcc -o test test.c
# ./test
sizeof(char): 1
sizeof(short): 2
sizeof(int): 4
sizeof(long): 8
sizeof(long long): 8
sizeof(float): 4
sizeof(double): 8
32bit
操作系统下编译运行:
# gcc -o test test.c
# ./test
sizeof(char): 1
sizeof(short): 2
sizeof(int): 4
sizeof(long): 4
sizeof(long long): 8
sizeof(float): 4
sizeof(double): 8
3. 类中静态成员的初始化时间
编译运行:
# gcc -o test test.cpp -lstdc++
# ./test
A constructor
main ...
由此我们得出,类的静态成员初始化时间发生在: 从静态存储区加载到内存时
4. 栈的生长方向
在常见的x86中内存中栈的增长方向就是从高地址向低地址增长,但也有些不常用的处理器可能不同。有多种方法可以获得栈的生长方向。下面我们简单介绍:
1) 通过递归函数调用
我们可以通过递归函数调用来获得栈的生长方向。参看如下示例:
编译运行:
# gcc -o test test.c
# ./test
向低地址方向生长
2) 直接阅读汇编指令
我们可以通过直接阅读汇编指令来判断。例如,在IA-32
中,如果在一个过程的开始阶段(准备段)出现类似sub $0x10,%esp
,说明栈顶指针(%esp)是变小的,因此栈是向低地址增长的。
3) 显示栈顶指针寄存器的内容
我们可以通过GDB等工具,在某个过程开始阶段和结束阶段分别显示栈顶指针寄存器的内容,比较它们的大小。若开始处的值比结束处的大,则说明是向低地址增长的。
5. 大小端
在计算机中经常涉及到大小端的问题,关于大小端的定义如下:
- 大端模式: 是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理————地址由小向大增加,而数据从高位往低位放; 这和我们的阅读习惯一致。
注: 大端模式又称为网络字节序
- 小端模式: 是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效的结合起来,高地址部分权值高,低地址部分权值低。
以下图为例:
[参看]:
-
网络带宽的测试算法研究
-
C++静态变量内存分配,编译阶段,解密
-
C 语言标准库实现
-
栈增长方向与大端/小端问题
-
leetcode
-
leetcode刷题
-
C++书籍推荐
-
在线工具