sizeof()计算
本节包含sizeof()计算结构体,位域,数组,字符串,指针,c++中的class等类型的大小,sizeof()计算的大小都是以字节为单位。
一 计算基本类型的长度
sizeof(char): 1
sizeof(short): 2
sizeof(int): 4
sizeof(long): 4(win X86 和 win X64长度都为4, Linux X86长度为4,Linux X64为8)
sizeof(float):4
sizeof(double):8
sizeof(bool):1(在C++里长度为4)
sizeof(BOOL):4 (在windows平台长度为4)
sizeof(p):指针类型在X86长度为4,X64长度为8,如char *p
二 计算结构体的长度
要正确计算sizeof(结构体)的大小,需要理解和掌握数据对齐的概念。数据对齐的概念在前面内存中的数据对齐 和 自然对齐和强制对齐有介绍。
关键是记住自然对齐和强制对齐的对齐规则,计算sizeof(结构体)的大小就很简单了。
三 计算数组长度
char str[] = "hello"; sizeof(s)大小是多少
1 普通情况
str是字符数组,由字符串"hello"初始化,"hello"; 共5个字符,又字符串以 '\0' 结尾。所以str数组的长度是6
sizeof(s)为6
2 str数组做函数参数
在函数里,数组str作为参数传进来,在函数内部str是指针的形式。所以:
sizeof(s)为4 X86平台
sizeof(s)为8 X64平台
四 计算union的长度
在使用sizeof计算union类型的时候,整个union结构的大小等于union中最大成员的大小,并且必须是最大类型的整数倍。
例如:
typedef union
{
long i;
int k[5];
char c;
} DATE;
struct data
{
int cat;
DATE cow;
double dog;
} too;
DATE max; sizeof(struct data) = ?sizeof(max))=?
分析:
由于max是union DATE类型,那么其中最大的成员为k,所以sizeof(MAX)=k成员的长度=5*sizeof(int)=20
对于struct data结构体,按照自然对齐方法,计算出结果为:sizeof(struct data)=4+20+8=32
五 计算位域结构的大小
位域结构的大小在位域(位段)有介绍。
六 计算类和对象的大小 (C++中)
class A
{
public:
A();
~A(); private: }; void main()
{
printf("sizeof(A): %d\n", sizeof(A));
getchar();
}
sizeof(A) = 1。因为类的实例化就是给每个实例在内存中分配一块内存地址。空类被实例化时,会由编译器隐含得添加一个字节,所以为1。
class B
{
void fn1();
void fn2();
protected:
char a;
char b;
int c;
static int d;
};
sizeof(B) = 8。
类B中最大类型是int。a长度1字节,b长度1字节,int型c内存地址必须可以被4整除,static变量d不影响类的大小。
所以sizeof(B) = 变量a的长度1 + b的长度1 + 对齐2字节 + 变量c的长度4字节 = 8
class A
{
protected:
int a;
private:
int b;
};
class B :public A
{
private:
int c;
};
sizeof(B) = 12 B继承A,所以B中包含了A中的所有数据,大小为A内的大小8+B内的大小4 = 12
class C
{
virtual void fun(){}
};
sizeof(C) = 4 因为类C中包含一个指向虚函数表的指针。
class D
{
virtual void fun1() {} virtual void fun2() {}
};
sizeof(D) = 4 多个虚函数只需要一个指向虚函数表的指针
七 sizeof与strlen
char *p1 = "12345678";
char p2[] = "12345678";
char p3[1024]="12345678";
char p4[] = {'1','2','3','4','5','6','7','8'};
sizeof(p1)=?
sizeof(p2)=?
sizeof(p3)=?
sizeof(p4)=?
strlen(p1)=?
strlen(p2)=?
strlen(p3)=?
strlen(p4)=?
分析:
p1是一个字符指针,指向了静态常量区的一个常量字符串,"12345678"。所以,sizeof(p1)=指针的长度=4;strlen(p1)=字符串"12345678"的长度(不含'\0'),所以是8。
p2是一个字符数组,由静态常量区的"12345678"进行初始化。所以sizeof(p2)是计算数组p2的长度,所以结果为"12345678"的所有字符的长度(含'\0'),所以是9。 strlen(p2)也是在计算"12345678"的长度(不含'\0'),所以是8。
p3是一个字符数组,由静态常量区的"12345678"进行初始化,但长度为1024。 所以,sizeof(p3)=1024;strlen(p3)为字符串"12345678"的长度(不含'\0'),所以是8。
p4是一个字符数组,由字符'1','2','3','4','5','6','7','8'进行初始化, 这样初始化与"12345678"进行初始化的区别是 前者不包含'\0'。因此,sizeof(p4)=8。由于p4作为一个字符数组,并不以'\0'结尾, 所以strlen(p4)在计算字符串长度的时候,找不到结束符'\0',会发生字符串溢出。
所以,最后答案为:
sizeof(p1)=4
sizeof(p2)=9
sizeof(p3)=1024
sizeof(p4)=8
strlen(p1)=8
strlen(p2)=8
strlen(p3)=8
strlen(p4)=字符串溢出,值不确定,甚至会引起程序崩溃
八 sizeof其它
题目1:请设计一个宏,用来计算数组的长度。
解:#define ARRAYLEN(a) sizeof(a)/sizeof(a[0])
题目2:sizeof是函数吗?是在程序编译的时候计算的还是运行时?
解:sizeof是操作符而不是函数。sizeof是在程序编译的时候就计算完成了,而不是在程序运行的时候计算。
sizeof()计算的更多相关文章
- 你必须知道的指针基础-4.sizeof计算数组长度与strcpy的安全性问题
一.使用sizeof计算数组长度 1.1 sizeof的基本使用 如果在作用域内,变量以数组形式声明,则可以使用sizeof求数组大小,下面一段代码展示了如何使用sizeof: ,,,,,}; int ...
- c++面试常用知识(sizeof计算类的大小,虚拟继承,重载,隐藏,覆盖)
一. sizeof计算结构体 注:本机机器字长为64位 1.最普通的类和普通的继承 #include<iostream> using namespace std; class Parent ...
- Struct和Union的sizeof计算
struct 结构体的大小不是简单的成员相加,要考虑存储空间的字节对齐 1.空结构体的大小为1 2.含有static的结构体在计算大小时不算上static变量,因为static存储在全局数据空间,而s ...
- sizeof计算空间大小的总结
sizeof,看起来还真不简单,总结起来还是一大堆的东西,不过这是笔试面试中出现比较频繁的,我也是考过才觉得很重要,有些规则如果不注意,还真是拿到一道题目摸不着头脑,所有总结一下,方面忘记的时候瞄一瞄 ...
- 结构体变量的sizeof计算
结构体字节对齐准则: 1. 结构体变量的首地址能够被其最宽基本类型成员的大小所整除: 2. 结构体每个成员相对于结构体首地址的偏移量都是当前成员大小的整数倍,如有需要编译器会在成员之间加上填充字节: ...
- sizeof()计算结构体的大小
简要说明:结构体成员按照定义时的顺序依次存储在连续的内存空间,但是结构体的大小并不是简单的把所有成员大小相加,而是遵循一定的规则,需要考虑到系统在存储结构体变量时的地址对齐问题. 一.没有成员的结构体 ...
- sizeof 计算 struct 占字节数的方法总结
矛盾焦点: 1.结构体的内存对齐方式 字节对齐的目的: 1.提高CPU存储变量的速度 计算的核心点(默认对齐方式): 1.结构体内的每一个成员的起始地址跟结构体起始地址的偏移量要刚好是自己字节数的整数 ...
- [转]sizeof计算空间大小的总结
原文链接:http://www.cnblogs.com/houjun/p/4907622.html 关于sizeof的总结 1.sizeof的使用形式:sizeof(var_name)或者sizeof ...
- class类的sizeof计算
class no_virtual { public: void fun1() const{} int fun2() const { return a; } private: int a; } clas ...
随机推荐
- 【java异常】It's likely that neither a Result Type nor a Result Map was specified
错误原因:mybatis配置文件没有返回类型参数 resultType 解决办法:resultType= 添加
- MapReduce 程序mysql JDBC驱动类找不到原因及学习hadoop写入数据到Mysql数据库的方法
报错 :ClassNotFoundException: com.mysql.jdbc.Driver 需求描述: hadoop需要动态加载个三方jar包(比如mysql JDBC 驱动包),是在MR结束 ...
- BZOJ 3132: 上帝造题的七分钟 树状数组+差分
这个思路很巧妙啊 ~ code: #include <cstdio> #include <algorithm> #define N 2050 #define ll int #d ...
- css如何让父元素下的所有子元素高度相同
小颖最近做的项目中要实现一个样式 ,小颖怕自己忘记了,写个随笔记下来 需求父元素下有多个子元素,并且子元素过多时要实现自动换行,给每个子元素都加了右边框,而每个子元素里的内容多少不一定,这就会产生右边 ...
- CF852A Digits
CF852A Digits 隔壁yijian大佬写出了正解.那我就写一个随机化大法吧? 我们先考虑一种错误的贪心,每个数字分成一位,使其分割后数字和最小.虽然这样是错的,但是我们发现错误的概率很小,所 ...
- 基于ZYNQ的uart传输任意长度的数据
1.参考 UG585 网络笔记 参考:ZYNQ进阶之路14–PS端uart串口接收不定长数据 2.理论知识 参见上一次实验:基于ZYNQ 的UART中断实验之串口写数据到DDR3中 3.实验目的 基于 ...
- spark 操作hive
1.hive动态分区,只需进行以下设置 val spark = SparkSession.builder() .appName("hivetest") .master(" ...
- java 查找指定包下的类
package com.jason.test; import java.io.File; import java.io.IOException; import java.io.UnsupportedE ...
- redis的setIfAbsent
setIfAbsent(K key, V value) 如果键不存在则新增,存在则不改变已经有的值.
- 在RedisTemplate中使用scan代替keys指令
keys * 这个命令千万别在生产环境乱用.特别是数据庞大的情况下.因为Keys会引发Redis锁,并且增加Redis的CPU占用.很多公司的运维都是禁止了这个命令的 当需要扫描key,匹配出自己需要 ...