结构的存储分配,对齐

大小端存储模式和边界对齐 大小端存储和边界对齐 阅读详情

在做笔试题时总是碰到求结构体占用空间大小的问题,由于以前学得不细,在网上找了很久,总找不到想要的内容,没想到在书上找到了很详细的东东,以下内容摘自<<C和指针>>一书:

    编译器按照成员列表的顺序一个接一个地给每个成员分配内存。只有当存储成员时需要满足正确的边界对齐要求时,成员之间才可能出现用于填充的额外内存空间。为了说明这一点,考虑下面这个结构:

struct ALIGN{
    char    a;
    int    b;
    char    c;
};

    如果某个机器的整型值长度为4个字节,并且它的起始存储位置必须能够被4整除,那么这一个结构在内存中的存储将如下所示:



    系统禁止编译器在一个结构的起始位置跳过几个字节来满足边界对齐要求,因此所有结构的起始存储位置必须是结构中边界要求最严格的数据类型所要求的位置。因此,成员a(最左边的哪个方框)必须存储于一个能够被4整除的地址。结构的下一个成员是一个整型值,所以它必须跳过3个字节(用灰色显示)到达合适的边界才能存储。在整型值之后是最后一个字符。
如果声明了相同类型的第2个结构变量,它的起始存储位置也必须满足4这个边界,所以第1个结构的后面还要再跳过3个字节才能存储第2个结构。因此,每个结构将占据12个字节的内存空间但实际只使用其中的6个,这个利用率可不是很出色。
    你可以在声明中对结构的成员列表重新排列,让那些对边界要求最严格的成员首先出现,对边界要求最弱的成员最后出现。这种做法可以最大限度地减少因边界对齐而带来的空间损失。例如,下面这个结构
struct ALIGN2{
int    b;
char    a;
char    c;
};
    所包含的成员和前面那个结构一样,但它只占用8个字节的空间,节省了33%.两个字符可以紧挨着存储,所以只有结构最后面需要跳过的两个字节才被浪费。
    提示:
    有时,我们有充分的理由,决定不对结构的成员进行重排以减少因对齐带来的空间损失。例如,我们可能想把相关的结构成员存储在一起,提高程序的可维护性和可读性。但是,如果不存在这样的理由,结构的成员应该根据它们的边界需要进行重排,减少因边界对齐而造成的内存损失。
    当程序将创建几百个甚至几千个结构时,减少内存浪费的要求就比程序的可读性更为急迫。在这种情况下,在声明中增加注释可能避免可读性方面的损失。
    sizeof操作符能够得出一个结构的整体长度,包括因边界对齐而跳过的那些字节。如果你必须确定结构某个成员的实际位置,应该考虑边界对齐因素,可以使用offsetof宏(定义于stddef.h)。
    offsetof( type , member )
    type就是结构的类型,member就是你需要的那个成员名。表达式的结果是一个size_t值,表示这个指定成员开始存储的位置距离结构开始存储的位置偏移几个字节。例如,对前面那个声明而言,
    offsetof(struct ALIGN,b)的返回值是4。

附上C语言中各种类型在内存中所占用字节数:

C语言中各种类型所占字节数
C声明32位机器64位机器
char11
short int22
int44
long48
long long88
char *48
float44
double88














有关struct的空间的计算问题:

struct的空间计算较为复杂,总体上遵循两个原则:

  1)  整体空间是占用空间最大的成员(的类型)所占字节数的整数呗,但在32位Linux+gcc环境下,若最大成员类型所占字节数超过4,如double是8,则整体空间是4的倍数即可。

  2)  数据对齐原则——内存按结构体成员的先后顺序排列对齐,当排到该成员变量时,其前面已摆放的空间大小必须是该成员类型的大小的整数倍,如果不够则补齐,依次向后类推,但在Linux+gcc环境下,若某成员类型所占字节数超过4,如double是8,则前面已摆放的空间大小是4的整数倍即可,不够则补齐。

1.  当结构体中含有结构体时,则这两个原则应修改为:

  1)  整体空间是子结构体与父结构体中占用空间最大的成员(的类型)所占字节数的整数倍;但在Linux+gcc环境下,若最大成员类型所占字节数超过4,如double是8,则整体空间是4的倍数即可。

  2)  数据对齐原则——父结构体内存按结构体成员的先后顺序排列,当排到子结构体成员时,其前面已摆放的空间大小必须是该子结构体成员中最大类型大小的整数倍,如果不够则补齐,依次向后类推。但在Linux+gcc环境下,若某成员类型所占字节数超过4,如double是8,则前面已摆放的空间大小是4的整数倍即可,不够则补齐。

2.  含数组的结构体的空间计算  在结构体中,数组是按照单个变量一个一个进行摆放,而不是视为整体。

3.  含位域结构体的空间计算,位域的主要目的是压缩存储。其大致规则如下:

  1)  如果相邻位域字段的类型相同,且其位宽之和小于其类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止。在VS2010环境下,一个int a:4,如果后面不是位域,则占用4个字节,而在Dev-C++以及Linux+gcc编译环境下,采用了更加节省空间的方法,即不论位域为何类型,所占字节数以其实际占用字节数为准,以方便后续结构体成员的摆放,即一个int a:4,如果后面不是位域,仅占一个字节;

  2)  如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;

  3)如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩的方式,Dev-C++与gcc仍采取压缩方式;

  4)  如果位域字段之间穿插着非位域字段,则不进行压缩;

  5)  整个结构体的总大小为最宽基本类型成员大小的整数倍。

4.  使用 "#pragma pack"时结构体空间的计算

 一般伪指令#pragma pack(n),编译器将按照n个字节对齐,n为字节数,其取值为1,2,4,8,16等,默认是8,如果这个值比结构体成员的sizeof值小,那么该成员的偏移量应该以此值为准,即结构体成员的偏移量应该取二者的最小值;

 使用伪指令#pragma pack(),取消自定义对齐方式。

大话C语言:第42篇 结构体内存分配原则 每一个元素存入内存时,都会认为内存是以自己的宽度来划分空间的,因此元素存放的位置一定会在自己大小的整数倍上开始。vc6.0和Visual Studio环境下,8字节对齐,即存放double型变量的起始地址,必须是8的倍数,double变量占8字节。在64位系统下,以8字节为单位开辟内存。long int 在32位平台下,4字节对齐 ,即存放long int 型的变量,起始内存单元的编号是4的倍数即可。gcc环境下,4字节对齐,即存放double型变量的起始地址,必须是4的倍数,double变量占8字节。 阅读详情

相关推荐

硬盘dma读写过程

保护模式中,pci上的硬盘dma读写方法

480

计算机基础

计算机基础一、计算机组成1.1 冯罗依曼计算机组成1.2 计算机层次结构1.3 计算机性能指标1.3.1 非时间指标1.3.2 时间指标1.4 数据表示二、 存储系统2.1 存储系统层次结构2.1.1 主存问题2.1.2存储体系的结构化层次2.2 主存中的数据组织2.2.1 存储字长2.2.2 数据存储与边界的关系2.2.3 大端与小端存储方式2.3 存储器分类2.4 主存容量扩展2.5 Cache基本原理2.5.1 cache的工作过程:2.5.2 写策略2.5.3 地址映射机制2.5.4 替换算法2.6

xHai的博客 1975

PET,CT图像融合笔记

PET-CT怎样进行图像融合?图像融合实现CT与PET图像的融合 OpenCV实现(附实验结果)

chenran187906的博客 8409

数据边界对齐储存

数据对齐储存实际就是让数据地址按照其数据类型大小的整数倍进行储存,目的在于使得数据能以最少的次数连续读取。 假如32位的系统读取数据时一个字是32位或者4个字节,当数据储存时,会尽量按照数据类型大小的整数倍进行地址分配。 比如数据中: int为4个字节; long long是8个字节; char为1个字节。 那么在内存地址分配上: int只能放在首地址为0,4,8的位置上; long long放在首地址为0,8,16的位置上; char可以放在任意位置上。 当计算机进行读操作时,对于int类型数据只需要一个

WCHIMING的博客 1万+

光猫改桥接后,一根网线搞定IPTV和上网的保姆级教程(附VLAN配置避坑点)

本文详细介绍了光猫改桥接后如何通过单线复用技术实现IPTV和上网功能共存。从VLAN配置原理到具体操作步骤,包括光猫超级管理员权限获取、VLAN绑定设置及路由器IPTV功能配置,提供了全面的保姆级教程。特别针对常见问题如IPTV信号丢失、网速下降等给出了实用解决方案,帮助用户轻松避坑。

weixin_29927965的博客 1745

Stata做DID平行趋势检验,用coefplot画图时遇到的3个坑及解决办法

本文详细解析了使用Stata进行DID平行趋势检验时,利用coefplot绘图可能遇到的三个常见问题及其解决方案。包括基线期选择陷阱、置信区间变形和图形元素错位,提供专业调试步骤和高阶技巧,帮助研究者高效完成学术级图表绘制。

weixin_42530458的博客 324

数据的对齐存放

数据对齐概念 Alignment:要求数据的地址是相应的边界地址 目前机器字长为32位或64位,主存按一个传送单位(32/64/128位)进行存取,而按字节编址,例如:若传送单位为64位,则每次最多读写64位,即:第0~7字节同时读写,第8~15字节同时读写,……,以此类推。按边界对齐,可使读写数据位于8i~8i+7(i=0,1,2,…) 单元 指令系统支持对字节、半字、字及双字的运算 各种不同长度的数据存放时,有两种处理方式: – 按边界对齐(若一个字为32位) • 字地址:4的倍数(低两位为

u014555106的博客 9962

实战六十四:基于机器学习朴素贝叶斯的豆瓣Top250影评的情感分析与预测 附完整源码和数据

实战六十四:基于机器学习朴素贝叶斯的豆瓣Top250影评的情感分析与预测 附完整源码和数据

1563

大小端 & 边界对齐存储

一道 408 考研真题

modi000的博客 6005

使用阿里天池平台训练YOLO目标检测模型

YOLO算法是一种单阶段目标检测算法,由Joseph Redmon等人于2015年提出。与传统的两阶段检测算法相比,YOLO将目标检测问题转化为回归问题,直接预测边界框的位置和类别概率,大大提高了检测速度。YOLOv1: 首次提出YOLO的核心思想,将图像分割成网格,每个网格预测边界框和类别概率。YOLOv2: 引入了批量归一化、锚框等改进,提高了检测精度。YOLOv3: 采用多尺度预测,增强了对小目标的检测能力。

步子哥的博客 1090

PostgreSQL核心原理:数据库崩溃恢复的唯一真相详解

PostgreSQL崩溃恢复机制通过WAL日志确保数据一致性和持久性。核心流程包括:触发恢复(非正常关闭时)、读取控制文件获取检查点LSN、顺序扫描WAL日志进行Redo阶段重做已提交事务、利用MVCC标记未提交事务为ABORTED实现逻辑撤销,最后执行检查点完成恢复。该机制依赖WAL原子性、检查点锚点和无Undo的可见性模型三大支柱,保证即使系统崩溃也能恢复到逻辑一致状态。关键设计包括延迟写入、LSN顺序控制和FPW防部分写,最终通过确定性重放实现ACID特性。

数据知道的博客 2658

结构的存储分配——边界对齐

结构的存储分配规则: 1,编译器按成员列表的顺序为每个成员分配内存 2,结构的起始存储位置为该结构中边界对齐要求最严格的数据类型所要求的位置 3,第一个成员存放在偏移量为0的位置 接下来的各成员存放在偏移量为该成员的类型所占字节数的整数倍的位置 特别地,当成员为结构时,该结构成员存放在偏移量为该结构成员内占空间最大的成员所占字节数的整数倍的位置 4,结构大小为该结构中占用空间最大的成员的所占字节数...

yyy_hr的博客 6306

半导体材料仿真:二维材料仿真_(1).二维材料的基本概念

在半导体材料仿真领域,二维材料因其独特的物理和化学性质而受到广泛关注。二维材料,也称为二维纳米材料,是指在二维空间(通常是平面)上具有原子级厚度的材料。这些材料的厚度通常在几个纳米甚至单个原子层的范围内,使得它们在电子、光学、热学和机械性能上表现出与传统三维材料显著不同的特性。本节将详细介绍二维材料的基本概念,包括它们的分类、结构、性质以及在半导体材料仿真中的应用。

2401_87715305的博客 1545

(改写)结构在内存中的存储分配--对齐原则

知识点1:结构在内存中的存储分配--对齐原则      首先,我们应该知道:编译器对变量进行存储分配时,满足以下优化原则:          n字节元素首地址需要能够被n整除。该原则成为对齐原则。      现阐述结构体成员的内存分配规律:          从结构体的首地址开始,向后依次为每个成员寻找一个满足条件的首地址X,该条件为: X%N=0(N为各

sojisub__0173的博客 772

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

数据对齐存储

目录 计算机里面内存的数据存储结构以及为什么要边界对齐 行边界存储 结构的存储分配规则: 数据的大小端问题 参考文献 计算机里面内存的数据存储结构以及为什么要边界对齐 计算机里面的从主存的是有一个个基本的存储单元构成了,每个存储单元存储的二进制数叫做存储字长 目前一般的存储字长都是64位。同时计算机的主存都是按照字节编址,同时一般来说计算机的CPU只能访问偶数的地址 这种问...

id145的博客 6380

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

和小白一起学数据结构四之存储分配问题

和小白一起学数据结构(四) 昨天博主遇到十一点后发文不过审的问题,非常糟心。想弃了cdsn这枚小贱人(哼),但又想到和博主小白一起学习的你们,还是决定以后更新时间放在晚上十点之前(看来第二天的文要提前写了qaq)。 我们今天来干嘛,今天就跟博主一起好好梳理复习一遍c语言中涉及到的内存分配问题。有些同学跟博主反映博客东西太基础了,要小博加一些高大上的内容,emmm,说到这个高大上啊,例如卷积神经网络...

坚持更! 361

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

内存对齐

首先说一下结构的存储分配基本方法:按照结构体中成员中成员类型字节数最大的为标准,从上往下对结构体成员进行赋值,若当前成员的字节数小于最大成员字节数,接着为下一个连续分配内存,若下一个的内存分配后会大于最大成员字节数,则为当前成员补齐至最大成员字节数的整数倍。 先举几个例子熟悉一下边界对齐的计算方法: struct test1 { char b; char c; int...

Wu_ye123的博客 255

结构的存储分配

结构的存储分配: 结构在内存中是如何实际存储的呢?编译器按照成员列表的顺序- 一个接-一个地给每个成员分配内存。只有当存储成员时需要满足正确的边界对齐要求时,成员之间才可能出现用于填充的额外内存空间。即以成员最大的字节为准,从第一个开始往后分配内存空间,当成员小于最大类型字节时,就补齐至最大的成员字节数。 下面的一个例子: #include<stdio.h> typedef struct node { char a; //1字节 float b; //4字节 doubl.

一叶知秋 200

结构体、位段和联合体内存存储

结构体内存对齐 计算结构体的大小: 对齐规则: 1.基本数据类型有一个对齐值 2.自定义类型也有一个对齐值 3.指定对齐值 4.有效对齐值 #include<stdio.h> struct S1 { char c1; //1 + 3 int i; //4 char c2; //2 + 2 }; int main() { printf("%d\n", sizeof(struct S1)); system("pause"); return 0; } 结构体中 int

weixin_48273955的博客 398

C语言 结构体存储空间分配

这两天在看结构体,一直在琢磨结构体的存储空间分配的问题,琢磨了半天总算明白了。和大家分享一下,希望能有所帮助。 相信大家都知道结构体里元素存储要对齐吧,话虽是没错,只是这个“对齐”里面包含了很多微妙的东西。首先详细的给出结构体内存存储空间分配的原则吧:编译器按照成员列表顺序一个接一个地给每个成员分配内存。只有当存储成员时需要满足正确的边界对齐要求时,成员之间才可能出现用于填充的额外内存空间。

lijingyi2011的专栏 1998

结构体sizeof问题解惑

学习编译原理时遇到的习题,结构体的存储空间分配问题。上课时简单讲的对齐原理不足以解决问题,网上搜索后找到了合理解释,经过程序验证觉得可以,记录一下。 原帖地址:https://www.cnblogs.com/bewolf/p/4356903.html 一、为什么结构体计算这么乱? 答案是字节对齐,计算机存储系统中以Byte为单位存储数据,不同数据类型所占的空间不同,如:整型(int)数据占4个字节...

Mer_chen的博客 499

结构体(位段)内存分配

结构体(struct)在C和C++编程语言中是一种复合数据类型,它允许你将不同类型的数据项(变量)组合成一个单一的变量名。位段(Bit-fields)是结构体中的一种特殊成员,它允许程序员指定每个成员所占用的位数,而不是使用整个字节或更大的内存空间。最后,sty成员中的sex与score内存连续,但sty的内存大小与sex的内存位置也是数值差4。其次,stu成员中sex的内存位置不在21,即可推测name成员起始内存位置在0。首先,stu的内存大小并不为29个字节,即证明结构体内存不是所有成员的字节数和。

2301_79587525的博客 2490

c语言常量结构体的成员,c语言之结构体

c语言之结构体1.结构体基础知识C语言提供了两种类型的聚合数据类型(能够同时存储超过一个的单独数据),数组和结构。数则是相同类型的元素的集合,而结构也是一些值的集合,这些值称为它的成员,单一个结构的各个成员可能具有不同的类型。由于结构成员不一定是同种数据类型,所以不能用类似于数组的引用方式,而是用成员名来引用。1.1结构声明:struct tag {member-list} variable-li...

weixin_39928648的博客 1679

#pragma pack(n)结构体对齐与内存分配

#pragma pack(n) 解释一: 每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过预编译命令 #pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”。 规则: 1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方, 以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进 行。 2、结构(或联合)的

ZDQ1431的博客 893
上一篇: LeetCode || Median of Two Sorted Arrays
下一篇: LeetCode || 3Sum
坤哥玩csdn
博客等级 码龄17年 29粉丝 31原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值