sizeof的计算

一般而言,需满足三个准则:

1.结构体变量的首地址能够被最宽基本类型成员的大小所整除

2.结构体每个成员相对于结构体首地址的偏移量都是当前成员大小的整数倍,如有需要编译器会在成员之间加上填充字节

3.结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后填充字节

说明:

1.基本类型是指前面提到的像 char  short  int   float double  这样的内置数据类型

2.对于复合数据类型,如结构体嵌套结构体,那么基本类型是指前面提到的像char、short、int、float、double这样的内置数据类型

3.我认为计算结构体大小的时候,主要用到准则2和准则3,对于准则1是编译器自动完成的,不需要过多理会

4.C++中类可以看做特殊的结构体,所以类的sizeof的计算和结构体是一样的

下面结合前面给出的准则具体分析一下:

 1 #include “stdafx.h”
 2 #include<iostream>
 3
 4 using namespace std;
 5
 6 struct A
 7 {
 8     char a;
 9     int b;
10 };
11 struct B
12 {
13     char a;
14     A al;
15     char b;
16 };
17
18
19 int  main(int argc,char* argv[])
20 {
21     cout<<sizeof(A)<<endl<<sizeof(B);
22     return 0;
23 }

对于结构体A  其基本成员类型有char和int  两种 最宽的是int 占用4个字节  根据准则1,编译器自动为结构体A分配一个能被4整除的首地址,A的第一个成员char的首地址就是结构体A的首地址,接下来,下一个成员变量int首地址,如果不做处理的话,应该是相对于A的偏移量是1,这就不满足准则2了,所以编译器开始在char后面填充3个字节,使得int相对于A的偏移量是4,来满足准则2  然后结构体A的总大小就是:1(插入)+3(填充)+4(int).

对于结构体B 其中包括了一个符合类型,查看基本类型的时候,要将其中的结构体A拆分成char和int两种类型来看,所以结构体B中的基本数据类型就是char char  int char 最宽的数据类型是int ,编译器会自动为B分配一个能被4整除的首地址,B的第一个成员char的首地址就是结构体B的首地址,接下来,下一个成员变量A的首地址,如果不做处理的话,应该是相对于B的偏移量是1,这就不满足准则2了,所以编译器开始在char的后面填充3个字节使得成员A相对于所在结构体B的地址偏移量是4,来满足准则2,这时加上A的长度8,B的最后一个成员char相对于B来说地址偏移量是12,能满足准则2,所以不需要在A的后面填充字节,这时B的总长度是1(char)+3(填充)+8(A)+1 =13 不满足准则3,所以还需要在最后一个char后面再添加3个字节,所以最后B的总长度为13+3 = 16.

时间: 2024-12-18 19:51:49

sizeof的计算的相关文章

Sizeof的计算看内存分配

本文记录了有关sizeof的一些计算,主要有下面的四种情况:(如有错误,敬请留言) 使用sizeof()计算普通变量所占用的内存空间 sizeof计算类对象所占用空间的大小-用到了字节对齐 sixeof计算含有虚函数的类对象的空间大小 sizeof计算虚拟继承的类对象的空间大小 使用sizeof()计算普通变量所占用的内存空间 #include <iostream> #include <stdlib.h> using namespace std; //如果数组变量被传入函数中做si

浅论C++数组传入方法后不能用sizeof计算到正确的数组大小

C++中我们经常会用到sizeof()来计算数组的大小 例如: 1 #include<iostream> 2 using namespace std; 3 4 void Length(int *p) 5 { 6 cout<<sizeof(p)<<" "<<sizeof(int)<<endl; 7 } 8 9 int main() 10 { 11 int n; 12 int pirce[] = {0,1,5,8,9,10,17,

[转]sizeof计算空间大小的总结

原文链接:http://www.cnblogs.com/houjun/p/4907622.html 关于sizeof的总结 1.sizeof的使用形式:sizeof(var_name)或者sizeof var_name 2.变量名可以不用括号括住:sizeof a 3.数据类型必须用括号括起来:sizeof(int) 4.sizeof可以对表达式求值:sizeof(2+3.14),实际是sizeof(double) 5.sizeof可以对函数调用求值,实际上是对返回值类型求值 6.以下情况不能用

你必须知道的指针基础-4.sizeof计算数组长度与strcpy的安全性问题

一.使用sizeof计算数组长度 1.1 sizeof的基本使用 如果在作用域内,变量以数组形式声明,则可以使用sizeof求数组大小,下面一段代码展示了如何使用sizeof: int nums[] = {11,22,33,44,55,66}; int i; // sizeof(nums) 计算nums数组的总字节数 // sizeof(int) 计算int类型所占用的字节数 int length = sizeof(nums)/sizeof(int); for(i=0;i<length;i++)

JVM —— Java 对象占用空间大小计算

零. 为什么要知道 Java 对象占用空间大小 缓存的实现: 在设计 JVM 内缓存时(不是借助 Memcached. Redis 等), 需要知道缓存的对象是否会超过 JVM 最大堆限制, 如果会超过要设置相应算法如 LRU 来丢弃一部分缓存数据以满足后续内容的缓存 JVM 参数设置: 如果知道对象会被创建, 可以帮助判断 -Xmx 需要设置多少 只是为了好玩 一. 对象的内存布局 HotSpot 虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header).实例数据(Instan

C语言学习笔记--enum和sizeof关键字

1.enum关键字 C语言中enum关键字用来定义枚举类型 (1)enum 是 C 语言中的一种自定义类型(2)enum 值是可以根据需要自定义的的整型值(3)第一个定义的 enum 值默认为 0 (4)默认情况下的 enum 值是在前一个定义值的基础上加 1 (5)enum 类型的变量只能取定义时的离散值 enum Color { GREEN, //默认 GREEN==0; RED= 2, //自定义 RED==2; BLUE //默认情况,是在前一个的基础上加 1,即 BLUE==3 };

sizeof函数详解

原文链接http://blog.csdn.net/wzy198852/article/details/7246836 sizeof,一个其貌不扬的家伙,引无数菜鸟竟折腰,小虾我当初也没少犯迷糊,秉着“辛苦我一个,幸福千万人”的伟大思想,我决定将其尽可能详细的总结一下.但当我总结的时候才发现,这个问题既可以简单,又可以复杂,所以本文有的地方并不适合初学者,甚至都没有必要大作文章.但如果你想“知其然,更知其所以然”的话,那么这篇文章对你或许有所帮助.菜鸟我对C++的掌握尚未深入,其中不乏错误,欢迎各

C语言:内存地址分析 &amp; sizeof和strlen用法总结

还是在大学时代接触的C语言,当时学习数组.指针等概念时,怎一个"晕"字了得.最近在学习之余,疯狂地恶补了相关知识,故总结之,如有错误,请大家多多指点. 一. 内存地址分析 1) 先来看一个最基础的例子: int a[4]; 提问:&a[0],  a,  &a,  a+1,  &(a+1),  &a+1 分别表示什么? 咋一看,真的不知所措: 我们可以图解来分析它(假设下面的操作均在32为系统上面). 先来对上图进行简单的说明工作: 1. 紫色区域就是数组

C语言:sizeof()运算符

sizeof可以用来计算一个变量,一个常量,一种数据类型所占的内存字节数 sizeof一共有3种形式 sizeof(变量\常量) sizeof(10); char c = 'a';sizeof(c); sizeof 变量\常量 sizeof 10;char c = 'a';sizeof c; sizeof(数据类型) sizeof(float); 注意:不能sizeof 数据类型