探索内存大小段存储

1.

A的ASCII码16进制存储为41,对应B,C,D,E为42,43,44,45;

VS下为小段模式

2.

将高精度存入低精度时,截取掉高位,高位补ff,内存中默认用cc初始化

3.

#include<stddef.h>
#pragma pack(4)
struct A
{
	int a;
	char b;
	short c;
	char d[11];
};
aaaab0cc
dddddddd
ddd//应补齐最大对齐数的整数倍
int main()
{

	cout << sizeof(A) << endl;
	cout << offsetof(A,a) << offsetof(A,b) << offsetof(A,c) << offsetof(A,d) << endl;
	system("pause");
	return 0;
}

运行结果为:20   0,4,6,8

4.

struct B
{
int a;
char c;
double d;
};
//aaaac000
//dddddddd
cout << sizeof(B) << endl;
cout << offsetof(B,a) << offsetof(B,c) << offsetof(B,d) << endl;

运行结果:16  0,4,8

5.

struct A
{
	int a;
	char b;
	short c;
	char d[11];
};
struct B
{
	int a;
	char c;
	double d;
	A e;
};
cout << sizeof(B) << endl;
cout << offsetof(B, a) << offsetof(B, c) << offsetof(B, d) << offsetof(B, e) << endl;

运行结果:36  0,4,8,16

e不是对齐到d后面,按A本身最大整数倍对齐数。

6.

#include<stddef.h>
#pragma pack(4)
struct A
{
	int a;
	char b;
	short c;
	char d[11];
};
struct B
{
	int a;
	double d;
	char c;
	A e;
};
cout << sizeof(B) << endl;
cout << offsetof(B, a) << offsetof(B, c) << offsetof(B, d) << offsetof(B, e) << endl;

运行结果:36   0,4,12,16

7.

#include<stddef.h>
#pragma pack(8)
struct A
{
	int a;
	char b;
	short c;
	char d[11];
};
struct B
{
	int a;
	double d;
	char c;
	A e;
};
cout << sizeof(B) << endl;
cout << offsetof(B, a) << offsetof(B, c) << offsetof(B, d) << offsetof(B, e) << endl;

运行结果:40   0,8,16,20

总结:

  1. 结构体中第一个变量地址等于结构体起始地址
  2. 第一个变量永远对齐到0偏移(相对于结构体的起始位置),永远对齐(结构体中最大对齐数整数倍)-----结构体大小。
  3. 对齐数:结构体中最大的和系统中的较小者。windows:8,Linux:4
时间: 2024-11-05 22:53:42

探索内存大小段存储的相关文章

计算机中地址和内存大小的计算和编译出来的数据段

由地址计算内存大小(消除模糊认知) 在计算机中一个地址代表一个字节的内存的位置,即这个byte的门牌号,所以如果给出地址空间的起始地址是可以计算出内存大小的,比如STM32中Flash可编程的地址是从0x0800 0000开始到0x0801FFFF结束的所以内存大小的计算过程如下: 地址差 = 结束地址 - 开始地址  =  0x0001FFFF:他们可以表示的Byte的个数是N = 0x0001 FFFF + 1即0x00020000将N变换为十进制是131072. 内存大小 = N/1024

【转载】Android Studio 设置内存大小及原理

http://www.cnblogs.com/justinzhang/p/4274985.html http://tsroad.lofter.com/post/376316_69363ae Android studio 1.0.2默认最大内存是750M,这样跑起来非常的卡,难以忍受,机器又不是固态硬盘,最后发现,这个默认值是可以修改的,在android studio目录下找到:studio64.exe.vmoptions文件,绿色部分为修改的参数(-Xmx1050m),将默认参数修改为1050M

变量在内存中的存储方式-----“大端”和“小端”

"大端"和"小端"可以追溯到1726年的Jonathan Swift的<格列佛游记>,其中一篇讲到有两个国家因为吃鸡蛋究竟是先打破较大的一端还是先打破较小的一端而争执不休,甚至爆发了战争.1981年10月,Danny Cohen的文章<论圣战以及对和平的祈祷>(On holy wars and a plea for peace)将这一对词语引入了计算机界(<程序设计实践>第9章).这么看来,所谓大端和小端,也就是big-endia

C++类所占内存大小计算

C++类所占内存大小计算 转载时请注明出处和作者联系方式文章出处:http://blog.csdn.net/chenchong08作者联系方式:[email protected] 说明:笔者的操作系统是32位的. class A {}; sizeof( A ) = ?sizeof( A ) = 1明明是空类,为什么编译器说它是1呢?空类同样可以实例化,每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址.所

iOS 获取内存大小使用情况(进度条显示)

一.获取设备内存大小方法 //返回存储内存占用比例 - (NSString *)getFreeDiskspaceRate{ float totalSpace; float totalFreeSpace=0.f; NSError *error = nil; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSDictionary *dictionary

移码及浮点数在内存中的存储方式

首先说一下十进制的小数怎么转化为二进制的小数,计算机根本就不认识10进制的数据,他只认识0和1,所以,10进制的小数在计算机中是用二进制的小数表示的. 十进制的小数转化为二进制的小数的方法: 可以简单的概括为正序取整,将十进制的小数部分乘以2,然后取整数部分. 例如将0.2转化为二进制的小数,那么0.2*2=0.4,其整数部分是0,所以二进制小数的第一位为0,然后0.4*2=0.8,其整数部分是0,所以二进制小数的第二位为0,然后0.8*2=1.6,其整数部分是1,所以二进制小数的第三位是1,然

结构体在内存中的存储方式

结构体在内存中如何存储? 遵循结构体对齐规则: 1.首先要知道默认对齐数:VS 中 8   Linux 中4 2.第一个成员放到0偏移处 3.后面所有的成员都放到对齐数(本身和默认对齐数的较小值)的倍数处偏移 4.结构体总大小为所有对齐数中最大对齐数的倍数 Eg: 运行结果为 24 图中可以看出内存有浪费,而我们将小的成员放一起可以节省资源 减少浪费. 上例可以改为: int i: char c: double d: 这样总大小只需16 节省浪费. 空的结构体类型大小为1,创建对象需要开辟空间,

浅说数据类型占用的内存大小

看到有的资料说数据类型占用的内存大小跟操作系统有关,或者跟编译器有关,对于这方面,我也未研究的很深入,只说说我个人的理解 情景:修改某一游戏的玩家背包图鉴开启状态和宠物的三围 材料:安卓模拟器搭载Android 4.x的系统 ,内存修改器(烧饼或八门) 操作:使用烧饼修改器搜索 1920 的截图如上,可以看到1个DWBF就是一个int32 ,每个DBWF下有4个东西 分析:Android系统是32位,游戏的开发语言是C++,所以可知刚刚搜索的就是一个C++中的一个int,占四字节   下面再记录

Java对象的内存布局以及对象所需内存大小计算详解

1. 内存布局 在HotSpot虚拟机中,对象的内存布局可以分为三部分:对象头(Header). 实例数据(Instance Data)和对齐填充(Padding). 1) 对象头(Header): 对象头又可以分为两部分: 第一部分用来存储对象自身的运行时基本数据信息.如哈希码.GC分代年龄.锁状态标示.线程持有的锁等.这部分数据的长度在32bit和64bit虚拟机上分别为32bit和64bit.官方称呼是"Mark Word". 第二部分是类型指针,或者说指向类的元数据信息的引用.