struct T {
char a;
int *d;
int b;
int c:16;
double e;
};
T *p;

在64位系统以及64位编译器下,以下描述正确的是

A. sizeof(p) == 24

B. sizeof(*p) == 24

C. sizeof(p->a) == 1

D. sizeof(p->e) == 4

解析

也许很多同学选择了B,其实,我也选了这个。

但是,看了解析,我才发现,原来自己大意了。

因为,在64位系统下,地址占64位,即指针占64位,8个字节

所以,*p所占的内存是这要的:

a:本身占1个字节,字节对齐占7个字节,共8个字节

d:64位指针,占8字节

b:占32位,4个字节

c:16 :占16位,2个字节,字节对齐占2个字节,共4个字节

e:64位,8个字节

8 + 8 + 4 + 4 + 8 = 32

  • sizeof(p) == 8 P为指针,64位系统地址占8个字节

    sizeof(*p) == 24 根据内存对齐 32字节 a_ _ _ _ _ _ _ | * d 8字节| | b4字节| |c2字节|_ _ |e8字节|

    sizeof(p->a) == 1 正确

    sizeof(p->e) == 8 double

  • 字节对齐就是让每一个成员的开始地址是最大成员大小的整数倍,本题中最大的成员是e,占了8个字节,所以每一个成员的首地址都要是8的整数倍。

    a的首地址是0,是8的整数倍,为了确保后面一个成员开始的地址是8的整数倍,所以要填充7个字节;

    经过a的填充,d开始的地址是8的整数倍,不填充;

    b开始的地址是16,不需要填充;

    c占了2个字节,如果不填充那么下一个成员开始的地址是22,所以需要填充两个字节;

    e的首地址是24,本身是8个字节;

    所以加起来是32.

32位编译器
char :1个字节
char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节。同理64位编译器)
short int : 2个字节
int: 4个字节
unsigned int : 4个字节
float: 4个字节
double: 8个字节
long: 4个字节
long long: 8个字节
unsigned long: 4个字节
64位编译器
char :1个字节
char*(即指针变量): 8个字节
short int : 2个字节
int: 4个字节
unsigned int : 4个字节
float: 4个字节
double: 8个字节
long: 8个字节
long long: 8个字节
unsigned long: 8个字节

关于C语言内存占用的更多相关文章

  1. 虚函数列表: 取出方法 // 虚函数工作原理和(虚)继承类的内存占用大小计算 32位机器上 sizeof(void *) // 4byte

    #include <iostream> using namespace std; class A { public: A(){} virtual void geta(){ cout < ...

  2. C语言内存对齐详解

    一.字节对齐基本概念 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型 ...

  3. string与stringBuilder的效率与内存占用实测

    using UnityEngine; using System.Diagnostics; using System.Text; using UnityEngine.UI; public class s ...

  4. C语言内存对齐详解(2)

    接上一篇:C语言内存对齐详解(1) VC对结构的存储的特殊处理确实提高CPU存储变量的速度,但是有时候也带来了一些麻烦,我们也屏蔽掉变量默认的对齐方式,自己可以设定变量的对齐方式.VC 中提供了#pr ...

  5. C语言内存对齐详解(3)

    接上一篇:C语言内存对齐详解(2) 在minix的stdarg.h文件中,定义了如下一个宏: /* Amount of space required in an argument list for a ...

  6. C语言内存地址基础

    来源:http://blog.jobbole.com/44845/ 从计算机内存的角度思考C语言中的一切东东,是挺有帮助的.我们可以把计算机内存想象成一个字节数组,内存中每一个地址表示 1 字节.比方 ...

  7. C语言内存对齐原理

    一.什么是字节对齐,为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这 ...

  8. 深入理解C语言内存管理

    之前在学Java的时候对于Java虚拟机中的内存分布有一定的了解,但是最近在看一些C,发现居然自己对于C语言的内存分配了解的太少. 问题不能拖,我这就来学习一下吧,争取一次搞定. 在任何程序设计环境及 ...

  9. Python读取大文件的"坑“与内存占用检测

    python读写文件的api都很简单,一不留神就容易踩"坑".笔者记录一次踩坑历程,并且给了一些总结,希望到大家在使用python的过程之中,能够避免一些可能产生隐患的代码. 1. ...

随机推荐

  1. MVC+EFCore 项目实战-数仓管理系统1

    项目背景及需求说明 这是一个数据管理"工具类"的系统,计划有三个核心功能: 1.通过界面配置相关连接字符串,查询数据库的表数据. 2.配置相关模板,生成数据库表. 可以界面填报或通 ...

  2. P2629 【好消息,坏消息】

    其实刚开始看到这道题,应该很多都会想到区间DP中的合并石子,开一个2倍的空间(严格来说的话应该是2n-1),将本来的环变成一个链式的结构.然后对于得到的消息,可以预处理一个前缀和,这样就可以很方便的知 ...

  3. jQurey Select2 4.0

    https://jeesite.gitee.io/front/jquery-select2/4.0/index.htm

  4. (私人收藏)清新文艺唯美PPT模板

    清新文艺唯美PPT模板 https://pan.baidu.com/s/12hP5pT2KfPGCgOnvp0rOIAf0dj

  5. 【react】实现动态表单中嵌套动态表单

    要实现一个功能动态表单中嵌套动态表单如下: 仔细看看antd的文档其实不难 具体步骤如下 1.建立一个 名为 ConcatRegion的组件(动态表单A)代码如下 export function Co ...

  6. Spring Boot -- 启动流程分析之ApplicationContext 中

    上一节我们已经分析到AbsractApplicationContext类refresh方法中的postProcessBeanFactory方法,在分析registerBeanPostProcessor ...

  7. C#读取Excel转换为DataBle

    /// <summary> /// Excel->DataTable /// </summary> /// <param name="filePath&q ...

  8. hacknos靶机实战

    工具: kali 192.168.1.6 nmap 打开使用nmap -sP 192.168.1.0/24 扫描活跃的主机 发现目标ip 使用nmap 查看开启了什么服务Nmap -v -A -PN ...

  9. java 基本语法(十一) 数组(四)数组的常见算法

    1.数组的创建与元素赋值: 杨辉三角(二维数组).回形数(二维数组).6个数,1-30之间随机生成且不重复. 杨辉三角 public class YHSJ { public static void m ...

  10. python 面向对象专题(十):特殊方法 (三)__get__、__set__、__delete__ 描述符(三)方法是描述符

    在类中定义的函数属于绑定方法(bound method),因为用户定义的函数都有 __get__ 方法,所以依附到类上时,就相当于描述符.示例 20-13 演示了从 面向对象专题(九)示例 20-8 ...