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了今天就到这吧。继续加油啊!
- C++基础系列(1)
- 编程语言系列(一)--C语言基础知识点总结
- 复撸C系列(3)-文件基础IO
- 复撸C系列(4)-文件基础IO(续)
- python C/S模式基础编程 (网络安全系列)
- python C/S模式基础编程 (网络安全系列)
- C语言基础系列--字符串有关内容
- C语言基础系列--运算符
- linux环境C开发系列0-基础
- 系列:iOS开发-C语言基础
- 密码学基础系列之1(1.1)
- Shell编程基础系列(1)------ls
- shiro系列(1)--shiro基础
- Recyclerview系列(1)--基础使用
- python系列四.1(numpy基础)
- Git系列学习(1)-基础配置
- 基础系列(1)-傻瓜模拟【寻宝】(基础+)
- C-1-C基础
- 算法之动态规划--0、1背包
- PCA主成分分析
- .NET 环境下进行单元测试
- 多平台的开源股票市场技术分析库:TA-LIB
- Objective-C关于分类、扮演、协议
- C++基础系列(1)
- 第3周项目4考了语文数学的学生
- 分支-16. 计算分段函数(10)
- Ogre3d 2.1 源码编译安装教程
- 10810-Ultra-QuickSort【逆序数、树状数组离散化】
- TCP与UDP总结
- BZOJ1007【HNOI2008】水平可见直线
- 题目 1026 又一版 A+B 九度Online Judge
- 32位、64位、以及如何得知自己的电脑是否支持64位的系统