一、结构体内存分配原则

  1. 原则一:结构体中元素按照定义顺序存放到内存中,但并不是紧密排列。从结构体存储的首地址开始 ,每一个元素存入内存中时,它都会认为内存是以自己的宽度来划分空间的,因此元素存放的位置一定会在自己大小的整数倍上开始。

  2. 原则二: 在原则一的基础上,检查计算出的存储单元是否为所有元素中最宽的元素长度的整数倍。若是,则结束;否则,将其补齐为它的整数倍。

    注意:如果有充分的理由决定不对结构的成员进行重排,以减少因对齐带来的空间损失。列如,为了提高程序的可维护性和可读性,将相关的结构成员存储在一起。应该根据结构成员的边界需要进行重排,减少因边界对齐而造成的内存损失。

二、结构体长度

  1. sizeof操作能够得出一个结构的整体长度,包括因边界对齐而跳过的那些字节。
  2. offsetof能查找指定成员的实际位置
    offsetof(type, member);
    // type 结构体类型
    // member 结构体成员

三、测试程序

#include <stdio.h>
#include <stddef.h> int main(int argc, char *argv[]) { struct struct_test1 {
char a;
int b;
char c;
}; struct struct_test2 {
int a;
char b;
char c;
}; printf("The length of structure test1 is: %ld \r\n", sizeof(struct struct_test1) );
printf("Location of parameter B: %ld \r\n", offsetof(struct struct_test1, c) ); printf("The length of structure test1 is: %ld \r\n", sizeof(struct struct_test2) );
printf("Location of parameter B: %ld \r\n", offsetof(struct struct_test2, c) ); return 0;
}

运行结果:



从运行结果可以得出 结构成员排序会影响内存的大小。

C语言结构体的内存分配的更多相关文章

  1. C语言结构体变量内存分配与地址对齐

    地址对齐简单来说就是为了提高访问内存的速度. 数组的地址分配比较简单,由于数据类型相同,地址对齐是一件自然而然的事情. 结构体由于存在不同基本数据类型的组合,所以地址对齐存在不同情况,但总体来说有以下 ...

  2. C语言 结构体的内存对齐问题与位域

    http://blog.csdn.net/xing_hao/article/details/6678048 一.内存对齐 许多计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的首地 ...

  3. 解析C语言结构体对齐(内存对齐问题)

    C语言结构体对齐也是老生常谈的话题了.基本上是面试题的必考题.内容虽然很基础,但一不小心就会弄错.写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的 ...

  4. C语言结构体的内存对齐问题

    在C语言开发当中会遇到这样的情况: #include <stdio.h> struct test { int a; char b; }; int main(int argc, const ...

  5. C语言结构体在内存中的存储情况探究------内存对齐

    条件(先看一下各个基本类型都占几个字节): void size_(){ printf("char类型:%d\n", sizeof(char)); printf("int类 ...

  6. 3.c语言结构体成员内存对齐详解

    一.关键一点 最关键的一点:结构体在内存中是一个矩形,而不是一个不规则形状 二.编程实战 #include <stdlib.h> #include <stdio.h> stru ...

  7. C语言结构体及其内存布局

    code[class*="language-"], pre[class*="language-"] { color: rgba(51, 51, 51, 1); ...

  8. C语言结构体占用空间内存大小解析

    结构体的数据类型的有点我们就不啰嗦了,直接来看相同数据结构体的几种书写的格式吧. 格式一: 01.struct tagPhone 02.{ 03.     char   A; 04.     int  ...

  9. c语言结构体在内存中存储,字节对齐

    注意: 出于效率的考虑,C语言引入了字节对齐机制,一般来说,不同的编译器字节对齐机制有所不同,但还是有以下3条通用准则: (1)结构体变量的大小能够被其最宽基本类型成员的大小所整除: (2)结构体每个 ...

  10. 36深入理解C指针之---结构体的内存处理

    一.有关结构体的内存处理包括,结构体指针和结构体成员指针的内存分配.结构体成员的数据对齐.结构体的内存释放 1.定义:与自定义数据类型(结构体)有关的内存分配.大小和释放问题 2.特征: 1).用内存 ...

随机推荐

  1. C# 二维码生成、识别,去除白边、任意颜色

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  2. KingbaseES 串行化隔离级别引起的阻塞分析

    前言 这是实际生产环境中遇到的一个问题,前端业务有如下报错: could not serialize access due to read/write dependencies among trans ...

  3. java:寻找两个字符串的最长公共子串

    java:寻找两个字符串的最长公共子串 // 找一个字符串的所有子串 public static List<String> findAllStr(String s) { List<S ...

  4. gRPC入门学习之旅(四)

    gRPC入门学习之旅(一) gRPC入门学习之旅(二) gRPC入门学习之旅(三) 实现定义的服务 9.在"解决方案资源管理器"中,使用鼠标左键选中"Services&q ...

  5. 腾讯tvp之路

    王清培 腾讯tvp之路

  6. Tomcat内存马分析

    前言 自己简单搭建一个Tomcat项目,IDEA里选择JavaEE,勾上web就行了 加个依赖(这样就能找到三个Context了: <dependency> <groupId> ...

  7. java中的内部类内部接口详解

    目录 简介 内部类 静态内部类 非静态内部类 静态方法内部类 非静态方法的内部类 匿名类 内部接口 总结 简介 一般来说,我们创建类和接口的时候都是一个类一个文件,一个接口一个文件,但有时候为了方便或 ...

  8. OpenHarmony定义组件重用样式:@Styles装饰器

      如果每个组件的样式都需要单独设置,在开发过程中会出现大量代码在进行重复样式设置,虽然可以复制粘贴,但为了代码简洁性和后续方便维护,我们推出了可以提炼公共样式进行复用的装饰器@Styles. @St ...

  9. jemter做参数化的几种方法

    第一种:使用用户参数:添加--前置处理器--用户参数

  10. ASP.NET 部署常见问题及解决方案

    ASP.NET 部署部署过程中常见问题及解决方案 Could not load file or assembly 'XXXXX' or one of its dependencies. Access ...