c/c++学习笔记(一)

书籍

1、《Essential C++》
2、《C++ Primer》
3、《Effective C++》《More Effective C++》
4、《C++标准程序库》
5、《深度探索c++对象模型》

各种变量类型的大小

各个类型的变量长度由编译器来决定(实际上与操作系统位数和编译器都有关)使用时可用sizeof()得到,当前主流编译器一般是32位或64位。

sizeof()功能:计算数据空间的字节数

1. 与strlen()比较
strlen()计算字符数组的字符数,以"\0"为结束判断,不计算为’\0’的数组元素
而sizeof计算数据(包括数组、变量、类型、结构体等)所占内存空间,用字节数表示, 会计算’\0’

// An highlighted block
//两者差1为即差‘\0’
char str[5] = "abcd";
strlen(str) == 4
sizeof(str) == 5

另,字节数概念:1、bit为位即0与1(计算机中的最小数据单位);2、8个bit组成一个字节byte(存储空间的基本计量单位),通常一个字节可存一个英文,两个可存汉字,上述代码计算的即为字节数;3,字由字节组成的,它是计算机处理数据时一次存取,加工和传送的数据长度,它的位数称之字长,一台8位机子:一个字等于1个字节,字长为8位,如果是16位的机子,一个字等于2个字节,字长为16,32位则为4个字节,字长32位。字是计算机处理数据和运算的单位。

2. sizeof 语法
sizeof有三种语法形式:
1) sizeof (object); //sizeof (对象)

2) sizeof object; //sizeof 对象

3) sizeof (type_name); //sizeof (类型)
对象可以是各种类型的变量,以及表达式(一般sizeof不会对表达式进行计算)。

3. 基本数据类型的sizeof
基本数据类型是指short、int、long、float、double这样的简单内置数据类型,它们的内存大小是和系统相关的,所以在不同的系统下取值可能不同。

4.结构体的sizeof
结构体的sizeof涉及到字节对齐问题。计算机组成原理告诉我们字节对齐有助于加快计算机的取数速度,否则就得多花指令周期。

为此,编译器默认会对结构体进行处理(实际上其它地方的数据变量也是如此),让宽度为2的基本数据类型(short等)都位于能被2整除的地址上,让宽度为4的基本数据类型(int等)都位于能被4整除的地址上,依次类推。这样,两个数中间就可能需要加入填充字节,所以整个结构体的sizeof值就增长了。

字节对齐的细节和编译器的实现相关,但一般而言,满足三个准则:
1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除。
2) 结构体的每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要,编译器会在成员之间加上填充字节(internal adding)。
3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要,编译器会在最末一个成员后加上填充字节(trailing padding)。

注意:空结构体(不含数据成员)的sizeof值为1。试想一个“不占空间“的变量如何被取地址、两个不同的“空结构体”变量又如何得以区分呢,于是,“空结构体”变量也得被存储,这样编译器也就只能为其分配一个字节的空间用于占位了。

5. 联合体的sizeof
结构体在内存组织上是顺序式的,联合体则是重叠式,各成员共享一段内存;所以整个联合体的sizeof也就是每个成员sizeof的最大值。

6. 数组的sizeof
数组的sizeof值等于数组所占用的内存字节数。

7.数组的sizeof
指针是用来记录另一个对象的地址,所以指针的内存大小当然就等于计算机内部地址总线的宽度。与指针所指对象半毛钱关系都没有!
在32位计算机中,一个指针变量的返回值是4。
在64位计算机中,一个指针变量的返回值是8。

8. 函数的sizeof
sizeof也可对一个函数调用求值,其结果是函数返回值类型的大小,函数并不会被调用。
对函数求值的形式:sizeof(函数名(实参表))
注意:
1)不可以对返回值类型为空的函数求值。
2)不可以对函数名求值。
3)对有参数的函数,在用sizeof时,须写上实参表。

数据类型长度表格(单位byte)

类型32位计算机64位计算机
int44
short int22
long int48
long long int88
char11
char *48
float44
double88

参考资料

https://www.cnblogs.com/huolong-blog/p/7587711.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值