C++结构体-内存对齐

C++结构体内存对齐规则 阅读详情
  • 使用关键字 struct 。
  • 尽管结构体可以包含成员函数,但它们很少这样做。所以,通常情况下结构体声明只会声明成员变量。
  • 结构体声明通常不包括 public 或 private 的访问修饰符。
  • 类成员默认情况是private 的,而结构体的成员则默认为 public。

结构体内存对齐

1.结构体为什么要进行内存对齐?怎么对齐?

内存对齐是一种典型的空间换时间以提高效率的方式。

若无内存对齐情况下,按照连续存储时,1234 5678作为8字节,在结构体中,char c会存储在1号位上,而int i会存储在2345位上,而CPU在读取在访问c的时候,每次访问4个字节,没有什么问题,会先拿出1---4,再拿出5---8,但是int i被切割开了,仍需要做字节切割及字节拼接,效率很低。

而进行内存对齐时,将char c存放在1号位,再偏移3个字节,将int i存储在5--8号位,这样CPU进行访问的时候,不必做字节上的拼接和切割,效率会大大提高。

2. 结构体内存对齐规则

1)第一个成员在与结构体偏移量为0的地址处。
2)其他成员变量要对齐到对齐数整数倍的地址处。
      注意:对齐数 = 编译器默认的一个对齐数与该成员大小的较小值。
      VS中默认的对齐数为8,gcc中的对齐数为4
3)结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。
4)如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

2.示例程序

C++笔记之结构体内对vector初始化,一般初始化,和类内私有vector类型成员变量初始化 【代码】C++笔记之结构体内对vector初始化,一般初始化,和类内私有vector类型成员变量初始化。 阅读详情

相关推荐

C++笔记之内存对齐结构体对齐

如果尝试在未对齐的地址上读取数据,硬件会直接触发异常或崩溃(如总线错误 Bus Error)。CPU 并不是一个字节一个字节地从内存中读取数据的,而是以块(Chunk/Word)为单位读取,常见的块大小是 4 字节(32位系统)或 8 字节(64位系统)。简单来说,就是要求数据的起始地址必须是某个数字(通常是 2、4、8 等)的倍数。虽然从逻辑上看,内存就像一个连续的字节数组,CPU 可以访问任意位置,但现代计算机的底层硬件并不是这样工作的。在 C/C++ 等语言中,结构体struct)的对齐最为典型。

小勇博客 443

指针和数组的区别

编译器会把数组名转换为一个指针常量,是数组中的第一个元素的地址,类型就是数组元素的地址类型,如: int a[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 数组名a若出现在表达式中,如int *p=a;那么它就转换为第一个元素的地址,等价于int *p=&a[0]; 也正是因为如此数组名在表达式中不能作为左值,当其作为右值时其意义与&a[0]是一致的。 只有两种情况下例外: 第一种是对数组名使用sizeof运算符 sizeof(a) :这将会得到

baidu_16370559的博客 619

东方财富个股实时行情爬虫实战:从入门到精通,手把手教你构建股票数据采集系统

在量化投资、股市分析和数据挖掘等领域,获取实时、准确的股票行情数据是第一步也是至关重要的一步。东方财富网作为国内最大的财经门户网站之一,提供了丰富的股票数据和实时行情接口。本文将带你从零开始,构建一个完整的东方财富个股实时行情爬虫系统,涵盖股票代码遍历、JSON接口分析、反爬虫策略应对、数据持久化存储等核心技术点。目录前言一、项目背景与目标1.1 为什么要爬取东方财富数据?1.2 项目目标1.3 技术栈二、接口分析与逆向工程2.1 寻找真实数据接口2.2 简化接口2.3 字段含义对照表三、股票代码获取。

2201_76125261的博客 122

vector结构体结合的简单应用

vector是STL中很重要的一个容器。简单地说,vector是数组的一种类表示,它提供了自动内存管理功能,可以动态地改变vector对象的长度,并随着元素的添加和删除而增大和减小。它提供了对元素的随机访问。在尾部添加和删除元素的时间是固定的,但在头部或中间插入和删除元素的时间复杂度为线性的。 在使用时需要添加头文件,为方便使用通常有 using namespace std;语句。 vecto

helanfeixue的博客 3430

struct类型的vector和sort使用

//http://www.voidcn.com/article/p-xnzwqsgc-bag.html #include<iostream> #include<string> #include<string.h> #include<vector> #include<algorithm> //sort struct a{ //定义一个结...

jr 983

c++可变长度对象(vector,map)作为struct成员

以前,C语言写结构体时。结构体成员都是基本类型,比如int、char、double之类的,最多也就边再套一个结构体成员,但它们都有一个特点。它们的大小是固定的,我不会有这样的担心。但是,我接触到string、vector这些类类型时,根据它们的特性:它们能动态扩充,就是你来多少内容,我都能存的下! 然后,我就想:那它们的变量大小是不是也扩充了,那是不是也导致所处的结构体的变量的大小也改变了呢? 因此,我查了下书。找到了答案:总结一下,简单来说就是,这些动态可变更存储长...

reason的博客 2374

C++ 类、结构体内存对齐

结构体与类的核心区别在于:结构体是值类型,内存栈分配,不支持继承;而类是引用类型,堆分配,支持继承。C++结构体成员默认public,类默认private。结构体大小计算需要考虑内存对齐,确保成员偏移量是自身大小的整数倍

平平无奇的小甜菜 1240

c++结构体内存对齐

本文讨论c/c++内存对齐方式与原则,图文并茂说明,还有空结构体对齐特例。

noevil的博客 1756

[C++]关于结构体内存对齐

我们知道不同的变量、数组都有自己的大小,结构体也有自己的大小,但是= 该结构体成员变量自身的大小与编译器默认的一个对齐数的较小值。vs编译器中的默认对齐数是8,有些编译器没有设置默认对齐数,对齐数就是该成员变量自身的对齐数。

m0_64476561的博客 1067

C++结构体内存对齐

结构体的大小并不是简单地将每个结构体成员的大小相加就能得到。cpu一次能读取多少内存要看数据总线是多少位,如果是16位,则一次只能读取2个字节,如果是32位,则可以读取4个字节,并且cpu不能跨内存区间访问。三个原则:1、第一个成员的首地址为0.2、每个成员的首地址是自身大小的整数倍3、结构体的总大小,为其成员中所含最大类型的整数倍。

Rainbow 484

C/C++结构体内存对齐

C/C++结构体内存对齐原理的详细解释,详细介绍对齐规则,并利用一些示例进行讲解

mrqiuwen的博客 2360

C++结构体内存对齐

C++结构体内存对齐 内存对齐原因 首先要知道,cpu是把内存当作一块一块来读取的,块的大小可以是2,4,8,16个字节,这样内存对齐就可能会导致每次读取数据需要读取两次,内存对齐之后读取一次就行,可以大大提高内存的访问速度。 结构体内存对齐原则 第一个成员在与结构体偏移量为0的地址处 其他成员变量要对齐对齐数的整数倍的地址处。对齐数=编译器默认的一个对齐数和该成员大小的较小值。VS默认对齐数8,gcc默认对齐数4 结构体总大小:最大对齐数(所有变量类型最大者和默认对齐参数取最小)的整数倍。 如果嵌

qq_44559016的博客 511

浅谈C++结构体内存对齐

最近在认真学习C++基础,就此对于结构体内存对齐做个学习笔记

Jovi’s Blog 754

C/C++结构体内存对齐详解(深入探究结构体内存的保存形式)

结构体内存对齐

qq_45315034的博客 1377

C++面试题:结构体内存对齐

问题答案原因对齐模数4时占用内存12字节按默认4字节对齐,需填充最小占用内存8字节通过调整成员顺序(int → short → char)如何修改对齐模数alignas(1)通过编译器指令或C++11特性为什么不能设为1或21:导致未对齐访问,性能下降;2:无法满足int 4字节对齐要求CPU优化基于对齐内存关键点:内存对齐是CPU和编译器共同决定的,不是程序员随意可以修改的。

2301_80355452的博客 955

C/C++中的结构体对齐问题(内存对齐)

C/C++中的结构体对齐问题(内存对齐) 分类: c++ 2009-10-18 17:02 22人阅读 评论(0) 收藏 举报 由于程序运行时占用的内存过大,所以想办法给程序瘦身。 在调试中发现结构体占用的size竟然和预想的不一样,原来…… 看看下面讲的吧,肯定会不枉此看哦! 1,比如: struct{ short a1; short a2; sh

小菜鸟的专栏 955

C/C++ 内存对齐(一):结构体

内存管理是C/C++编程非常重要的一部分内容,熟悉C/C++中一些常见数据结构和数据类型的内存分布情况,可以很大程度上降低了coding过程中内存泄漏和越界等比较严重的内存问题,下面主要讨论一下结构体(类中同样存在内存对齐内存对齐会复杂一些,涉及到虚表等问题,后面介绍类的时候会提到)中的内存对齐问题。

lijian2017的博客 449

C/C++结构体内存对齐

C语言结构体内存对齐

做一只猫的博客 4828

C/C++---结构体内存对齐详解

对齐规则 (1) 第一个成员在与结构体变量偏移为0的地址处. (2) 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。 对齐数:编译器默认的一个对齐数与该成员大小的较小值(vs中默认值为8,Linux中默认值为4)。 (3) 结构体总大小为最大对齐数的整数倍。 最大对齐数:结构体的每个成员变量都有一个对齐数(该类型的大小),取最大。 (4) 如果嵌套了结构体的情况,嵌套的结构体对齐到自己成员最大对齐数的整数倍,结构体的整体大小就是所有最大对齐数(含嵌套结构体对齐数)的整数倍。 #include.

qq_42069216的博客 621

4路超声波驱动_4路AD9833驱动工程_

AD9833 驱动工程,已调试完毕。模拟4路SPI驱动4路波形发生。

上一篇: STL-vector
下一篇: 解决U盘在Linux系统只读的问题:[sdb] Write cache: disabled, read cache: enabled, doesn‘t support DPO or FUA
异曲新词
博客等级 码龄9年 0粉丝 9原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值