C++基础系列(1)

来源:互联网 发布:狐狸那时已是猎人知乎 编辑:程序博客网 时间:2024/06/11 18:19

1.记录const修饰符:const用来修饰类里的函数时,则不能改变此类中的所有成员变量。除非,变量被mutable修饰。
2.初始化量的表示:
class C{
public:
C(int i): m_count(i){}
}

实际上,就是将 i 的值赋给 m_count 即:m_count = i;
3.sizeof的问题

#include <iostream>#include <stdio.h>#include <string.h>using namespace std;struct{    short a1;    short a2;    short a3;}A;struct{    long a1;    short a2;}B;int main(){    char* ss1 = "0123456789";    char ss2[] = "0123456789";    char ss3[100] = "0123456789";    int ss4[100];    char q1[] = "abc";    char q2[] = "a\n";    char* q3 = "a\n";    char* str1 = (char *)malloc(100);    void *str2 = (void *)malloc(100);    return 0;}

看到这些东西,一下头都大了。还怎么区分长度。好吧,还是从头开始看起吧。
(1)结构体A的长度,根据结构体的长度规定,要按照处理器的长度来,当结构体中的数据长度小于处理器的长度时,就按照结构体中数据长度最长的那个数据长度来作为对齐单位,即结构体的长度一定是这个对其单位的整数倍。如果结构体中的数据长度超过了处理器的长度,那就按照处理器的长度为对齐单位,结构体中的长度仍然要是这个长度的整数倍。因为short 型是2个字节,三个short 就是6个字节,结构体对其参数按默认的8字节对齐,6也是2的整数倍,所以A的长度就是6.
(2)结构体B的长度,long是4个字节,short是2个字节,按照4个单位来对齐,4+2是6个单位,6不是4的整数倍,接着就补全,一直到8个长度时,是4的单位,所以,B的长度就是8了。
(3)ss1的长度,因为ss1是一个字符指针,字符指针长度大小都是定值,就是4个字节,所以ss1的长度就是4了。
(4)ss2是一个字符数组,一共有10个字符,加上隐含的“\0”就是总共11个字符,所以ss2的长度就是11了。
(5)ss3是一个分配了长度的数组,长度为100,所以,ss3的长度就是100了。
(6)ss4是一个分配了长度的整型数组,长度为100,加上int长度为4,就是4*100,所以长度就是400了。
(7)q1是和ss2相似,长度为4。
(8)q2中\n算一个字符,所以长度为3。
(9)q3还是一个字符指针,长度是定值4。所以为4。
(10)str1还是个指针,长度仍然是4。
(11)str2仍然是个指针,长度仍然为4。
总结(搬运来自书):CPU的优化规则大致是对于N字节的元素来说,(N=2,4,8…),他的首地址可以被N整除,才能获得最好的性能,设计编译器的时候,遵循的原则是对于每一个变量,可以从当前位置向后找到第一个满足这个条件的地址作为首地址。
4.内存优化的问题,编译通常都是按照地址对齐后的地址来访问,如果没有对齐,系统就会调整,耗费时间和内存。如果一个地址是从0x0001开始的,是四个字节的,那么,他就会从0x0000开始读,因为你没有对齐,读完了4个字节,也就是到了0x0003的地方,接着要再读4个字节,到0x0007才读完了一个东西,相当于读了8个字节,多读了4个字节,浪费了时间浪费了内存。如下代码:

class B{    private:    bool a1;    int a2;    bool a3;};class C{    private:    int a1;    bool a2;    bool a3;}cout << sizeof(B) << endl;cout << sizeof(C) << endl;

这里面B和C的长度就不一样,bool是一个字节,int是四个字节,所以,B中,就会四个字节四个字节一组的分配,a1先分配了一个字节,后面空了三个字节,接着跟了一个int,占了四个,接着又跟了一个bool占了1个字节,也就是要占四个字节,不管你有没有四个字节,你都要占四个字节。C中的排序就比较好了,先是一个int占了4个字节,两个bool挨在一起,可以共享那四个字节的位置,所以,B的长度就是3*4=12个字节,而C就会是2*4=8个字节,减少了四个字节的使用,就改了个顺序,对效率内存的影响竟然这么大,下次一定好好认真考虑啊。
5.static静态变量是存放在全局数据区的,sizeof是计算栈中的分配的大小,所以不算在内。
6.#pragma pack(n)用来禁止对齐调整,轻易不要调整,可能会降低程序性能。两种常用场景:一种是这个结构需要写入文件,一种是网络传输过程中。
7.sizeof的使用场景:可以用来看某种类型的对象在内存中占了多少内存,动态分配的时候,让系统知道占了多少内存,便于扩充类型,比如某些结构类型中专门有一个字段用来存放长度。操作数的长度可能会出现变化,建议在涉及操作数字节大小的时候用sizeof代替常量计算。

好吧,晚上22:30了今天就到这吧。继续加油啊!

0 0
原创粉丝点击