C++ sizeof的常见使用

sizeof的常见用法

1. 基本类型所占的内存大小

类型 32位系统(字节) 64位系统(字节)
char 1 1
int 4 4
short 2 2
long 4 8
float 4 4
double 4 8
指针 4 8

上表中是基本类型在不同平台上所占用的内存大小,例如sizeof(int) = 4。

2.sizeof计算数组占用的字节数

使用sizeof计算数组占用内存的字节数的计算方法是 类型字节数*数组长度。

例如:

1 int m_aNums[3];
2 sizeof(m_aNums);

使用sizeof计算m_aNums的字节数是12。

3.sizeof计算单层结构体的大小

结构体中的成员变量可以是不同类型,是根据声明的顺序依次存入内存。跟数组不同的是,结构体的大小不是成员变量大小的简单相加。

结构体所占内存大小的字节数是由结构体内最后一个成员变量的偏移量+最后一个成员变量的字节大小计算而得的。

计算结构体所占的字节数有两个规则:

(1)每个结构体内成员变量的偏移量必须是该变量大小的整数倍。

(2)计算得到的结构体的大小必须是结构体内每个成员变量大小的整数倍,即结构体大小的值是每个成员变量大小的最小公倍数。

例如:

 1 typedef struct {
 2     int a;
 3     double c;
 4     short b;
 5 }SA;
 6
 7 typedef struct {
 8     int a;
 9     short b;
10     double c;
11 }SB;

结果:sizeof(SA) = 24;sizeof(SB) = 16。

分析:

注意:结构体内每个成员变量的偏移量 = 上一个成员变量偏移量 + 上一个成员变量的大小

SA结构体内:a的偏移量 = 0,a的大小 = 4;

c的偏移量 = 8,c的大小 = 8;(注意:c的偏移量不能是4,因此4不是c的大小的整数倍,因此c的偏移量必须补上4位变为8)

b的偏移量 = 16,b的大小 =  2;

计算得到结果24,不能是18,因为18不是4和8的最小公倍数,因此最后结果是需要补上6位得到其最小公倍数24。

SB结构体内:a的偏移量 = 0,a的大小 = 4;

      b的偏移量 = 4,b的大小 = 2;

      c的偏移量 = 8,c的大小 = 8;(注意:c的偏移量不能6,因为6不是c大小的整数倍,因此补上2位,变为8)

      计算得到结果是16。

从SA和SB两个结构体的计算大小可知,结构体内变量声明顺序的不同,会导致结构体所占大小的不同。

4.sizeof计算嵌套结构体的大小

sizeof计算嵌套结构体大小的计算规则:

(1)将嵌入的结构体展开,被展开的结构体的第一个成员变量的偏移量是被展开结构体中最大的成员变量大小的整数倍。

(2)最终计算的结构体的大小必须是所有成员变量大小的整数倍,这里所有成员变量计算的是展开后的变量,而不是将嵌入的结构体作为一个整体。

例如:

struct SC
{
      short i;
      struct
      {
           char c;
           int j;
      } ss;
      int k;
}  

sizeof(SC) = 16,其中ss.c的偏移量是4,而不是2。

时间: 2024-10-10 13:43:23

C++ sizeof的常见使用的相关文章

[C++常见面试笔试题汇总] 程序设计基础 - 内存分配、sizeof、指针篇

2 内存分配 系统蓝屏,很大原因都是系统自身代码有缺陷引起的,而系统代码缺陷很大程度上与内存分配不当有关.由于内存分配不当引起的堆栈溢出.缓冲区溢出等问题,常常会导致系统瘫痪甚至崩溃,所以理解内存分配对于一名合格的程序员而言非常有必要. 2.1 内存分配的形式有哪些? 一个C/C++编译的程序所占用的系统内存一般分为以下几个部分的内容: (1) 由符号起始的区块(Block Started by Symbol, BSS)段:BSS段通常是指用来存放程序中未初始化的全局数据和静态数据的一块内存区域

常见C++面试题(三)

strcpy和memcpy有什么区别?strcpy是如何设计的,memcpy呢? strcpy提供了字符串的复制.即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符.(保证dest可以容纳src.) memcpy提供了一般内存的复制.即memcpy对于需要复制的内容没有限制,因此用途更广. strcpy的原型是:char* strcpy(char* dest, const char* src); char * strcpy(char * dest, const

数据结构之常见的排序算法c语言实现

常见的简单排序算法有冒泡排序.选择排序.插入排序.快排.堆排序.归并排序.希尔排序等,这些排序的理论在网上有很多,这就只给出常见的排序算法源码,上学时候写的,不足之处欢迎大家指正. 下面几种排序的主函数入口为:     int main(int argc, char* argv[])         {      int i, len;      int a[] = {8,5,6,4,9,10,3,15,2,17};           len = (sizeof(a) / sizeof(a[0

Windows 下常见的反调试方法

稍稍总结一下在Crack或Rervese中比较常见的一些反调试方法,实现起来也比较简单,之后有写的Demo源码参考,没有太大的难度. ①最简单也是最基础的,Windows提供的API接口:IsDebuggerPresent(),这API实际上就是访问PEB的BeingDebugged标志来判断是否处于调试状态. if (IsDebuggerPresent()) //API接口 { AfxMessageBox(L"检测到调试器"); } else { AfxMessageBox(L&qu

C++ sizeof的内存计算(1)

文章来自NoAlGo博客原创:C++ sizeof的内存计算(1) 内存控制是程序设计过程中非常关键的一环,C/C++中使用sizeof计算数据占用的内存大小是一个常见的手段,但是这个问题涉及到很多基础的编程细节,能够很好地反映一个程序员的基本功,成为了笔试面试常见的问题之一.这里总结了一些常见的问题,鉴于篇幅问题,分成两部分进行,这里主要介绍比较基础的第一部分. C++ sizeof的内存计算(1) C++ sizeof的内存计算(2) 一 sizeof定义 在C++中sizeof的使用方法看

笔试面试那件小事(常见的C++基础题)

1->简述变量声明和定义的区别 为变量分配地址和存储空间称为定义,不分配地址称为声明.一个变量可以在多个地方声明,但只能在一个地方定义.加入extern修饰的变量的声明,说明此变量将在文件以外或者文件的最后面定义. 2->简述sizeof和strlen的区别 主要区别如下: sizeof是一个操作符,strlen是库函数:sizeof的参数可以是数据的类型,也可以是变量.而strlen的参数只能是以'\0'结尾的字符串参数. 编译器在编译时就计算出了sizeof的结果,而strlen函数必须在

内存泄漏以及常见的解决方法

  之所以撰写这篇文章是由于前段时间花费了非常大的精力在已经成熟的代码上再去处理memory leak问题.写此的目的是希望我们应该养成良好的编码习惯,尽可能的避免这种问题,由于当你对着一大片的代码再去处理此类的问题,此时无疑添加了解决的成本和难度.准确的说属于补救措施了. 1. 什么是内存泄漏(memory leak)?  指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况.内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内

常见C++面试题及基本知识点总结

1. 结构体和共同体的区别. 定义: 结构体struct:把不同类型的数据组合成一个整体,自定义类型. 共同体union:使几个不同类型的变量共同占用一段内存. 地址: struct和union都有内存对齐,结构体的内存布局依赖于CPU.操作系统.编译器及编译时的对齐选项. 关于内存对齐,先让我们看四个重要的基本概念: 1.数据类型自身的对齐值: 对于char型数据,其自身对齐值为1,对于short型为2,对于int,float,double类型,其自身对齐值为4,单位字节. 2.结构体或者类的

C程序中常见的内存操作错误

对C/C++程序员来说,管理和使用虚拟存储器可能是个困难的, 容易出错的任务.与存储器有关的错误属于那些令人惊恐的错误, 因为它们在时间和空间上, 经常是在距错误源一段距离之后才表现出来. 将错误的数据写到错误的位置, 你的程序可能在最终失败之前运行了好几个小时,且使程序中止的位置距离错误的位置已经很远啦.而避免这种噩梦的最好方法就是防范于未然. 幸好<深入理解计算机系统>中有一段讲: C程序中常见的内存操作有关的10种典型编程错误,十分经典, 因此抄写在此, 以便以后随时查看,复习. 把优秀