C++常见问题-总结3

来源:互联网 发布:淘宝促销海报 编辑:程序博客网 时间:2024/06/05 06:00

1,柔性数组

typedef struct list_t{struct list_t *next;struct list_t *prev;char data[0];}list_t;

char data[0]为柔性数组。它只能放在结构体末尾,是申明一个长度为0的数组,就可以使得这个结构体是可变长的。

对于编译器来说,此时长度为0的数组并不占用空间,因为数组名本身不占空间,它只是一个偏移量, 数组名这个符号本身代 表了一个不可修改的地址常量 (注意:数组名永远都不会是指针! ),但对于这个数组的大小,我们可以进行动态分配 请仔细理解后半部分,对于编译器而言,数组名仅仅是一个符号,它不会占用任何空间,它在结构体中,只是代表了一个偏移量,代表一个不可修改的地址常量!

对于0长数组的这个特点,很容易构造出变成结构体,如缓冲区,数据包等等:
注意:构造缓冲区就是方便管理内存缓冲区,减少内存碎片化,它的作用不是标志结构体结束,而是扩展
柔性数组是C99的扩展,简而言之就是一个在struct结构里的标识占位符(不占结构struct的空间)。

2,拷贝构造函数的特点

拷贝构造函数(复制构造函数):就是接受单个类类型引用形参(通常为const修饰)的构造函数。
拷贝构造函数的作用是将一个已知对象的数据成员拷贝给一个正在创建的另一个同类对象。

3 ,类型转换

a,同一类型的有符号和无符号之间的转换
同一类型的无符号和有符号的所占内存空间相同,只不过无符号类型将符号位当做数值位而已。

4,volatile关键字

volatile的作用是避免编辑器优化,即它是会随时变化的,

它不是non-const和const不矛盾,被const修饰的变量是在在当前作用域无法修改。但是可以被其他程序修改,所以const volatile int i = 0;表示任何对I的直接修改都是错误的,但是i可能被意外情况修改,不要做无意义的优化。

对于一般变量:为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中。以后再取变量值时,就直接从寄存器中取值。

几个应用例子:
a. 并行设备的硬件寄存器(如:状态寄存器)。
b. 一个中断服务子程序中会访问到的非自动变量。(个人理解:中断服务子程序不能用缓存在寄存器中的值来判断事件,因为那个值可能被修改了,需要重新读取。所以一般需要把这种变量声明为volatile。)
c. 多线程应用中被几个任务共享的变量。

0 0
原创粉丝点击