Windows下struct和union字节对齐设置以及大小的确定(一 简介和结构体大小的确定)...

在windows下设置字节对齐大小的方式,目前我了解有三种:


1. 在编译程序时候的编译选项  /Zp[n],如 cl /Zp4 表示对齐大小是4字节;

2. 预处理命令   #pragma pack( [ show ] | [ push | pop ] [, identifier ] , n  );

3. 微软特定命令  __declspec(align(#))。


下面我将分别介绍这三种,并分析不同方式的优缺点,先明确下字节对齐大小都是2的指数倍如1,2,4,8,16,32等。

方法一的用法最为简单,只需要在编译选项设置就行,该方式将作用于整个模块,因此是全局性的,不够灵活。

方法二的用法复杂点,但该方法可以在一个模块中不断的设置字节对齐大小,灵活性很强,针对不同的结构体采用不同的对齐大小,很适合这种方法,但用法较为复杂。

方法三的方法主要是作用于整个结构体上,是加强了字节对齐的限制,如将整个结构体对齐为64字节,不管里面元素总的大小,则结构体大小为大于总大小的最小的64倍数。


结构体大小的确定以及每个元素位置的确定:

对齐大小为 align(方法一和方法二设置的值,在vs2013中默认为8字节)、结构体中元素字节最大为max、结构体对齐align_struct(由方法三进行设置)

       假设内存是一个一个篮子用于存放结构体的每个变量, 而篮子肯定有大小   = min(align, max)大小为对齐大小和元素字节最大的 较小者。

下面就是将元素放入篮子的问题,有个原则是:

"The alignment of a member will be on a boundary that is either a multiple ofn or a multiple of the size of the member, whichever is smaller."

每个元素放置的位置 要么是 对齐大小的整数倍,要么是 该元素大小的整数倍,比较这两个值,哪个小就放在那。

若没有方法三设置,则最后结构体的大小就为篮子 大小的倍数,若有方法三的设置最后在考虑结构体整体的字节对齐。下面举个例子:

typedef struct A
{char ca;int ib;short sc;int  id;double de;
}A;

若对齐大小align=4, 则 max = 8 = sizeof(double), 篮子大小为 min(4,8) = 4.

char ca 放在第一个篮子中, 偏移为0

int ib 要放在的位置必须为4的倍数,所以放在第二个篮子中,偏移为4

short sc 要放在的位置为2的倍数, 所以放在第三个篮子中,偏移为8

       int id要放在位置为4的倍数, 第三个篮子没有这样的位置,所以放在第四个篮子中,偏移为12

      double要放在位置为4的倍数,放在第五个篮子和第六个篮子中,偏移为16,

可以看出总共用了6个篮子,总大小sizeof(A) = 24.


若添加方法三在结构体上 如下

typedef struct __declspec( align( 32) ) A
{char ca;int ib;short sc;int  id;double de;
}A;
修饰结构体的对齐大小为32,则sizeof(A) = 32 ,但每个元素在该结构体中偏移和上面都一样,只是在结构体的末尾添加字节用于对齐。


      现在只是简单介绍了三种方法和结构体大小的确定 ,将在后面具体介绍方法二和方法三的用法。


转载于:https://www.cnblogs.com/liwugang/p/7594101.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/428716.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1285B. Just Eat It

B. Just Eat It!&#xff1a;题目 题意&#xff1a;全部吃是否绝对比吃一部分好 思路&#xff0c;如果一部分总和是0或者负的&#xff0c;就可以通过吃另一部分大于等于全吃。#include <bits/stdc.h> using namespace std; typedef long long ll; vector<int> a((…

小米手机无法连上WIFI网络的解决方案

最近很多朋友提问&#xff0c;为什么自己的小米手机无法连上WIFI网络&#xff0c;这里本人就此问题&#xff0c;教大家如何解决故障&#xff1a;1.首先给大家看看故障现象&#xff1a;故障说明&#xff1a;虽然手机上已经打开WLAN&#xff0c;但是当手机连接无线路由器的时候&a…

1037C. Equalize

C. Equalize&#xff1a;题目 题意&#xff1a;a字符串变成b字符串&#xff0c;有两种方法&#xff0c;一种是选两个换位置&#xff0c;花费为abs[j-i]&#xff0c;二是单独一个变,花费为1。 思路&#xff1a;如果两个需要变并且不一样挨在一起就可以省一点花费。#include <…

bzoj1051[kosaraju算法]求强连通分量

之前一直用的是tarjan第一次学习到这个来试一下。 唔&#xff0c;就是裸的算法&#xff0c;然后如果出度为0的点只有一个&#xff0c;输出这个点的大小。 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<que…

1555C. Coin Rows

C. Coin Rows&#xff1a;题目 题意&#xff1a;仿佛是一道难的dp&#xff0c;但是因为Alice先走&#xff0c;走完bob想要最大化收益。 Alice走完后Bob要么一直往右走&#xff0c;要么一开始就下去然后往右走。#include <bits/stdc.h> using namespace std; #define int…

常见sql技巧

一、一些常见的SQL实践 &#xff08;1&#xff09;负向条件查询不能使用索引 select * from order where status!0 and stauts!1 not in/not exists都不是好习惯 可以优化为in查询&#xff1a; select * from order where status in(2,3) &#xff08;2&#xff09;前导模糊查询…

1466C. Canine poetry

C. Canine poetry&#xff1a;题目 题意&#xff1a;可以用任何小写英文字母替换其中的&#xff0c;使其没有回文子串 思路&#xff1a;如果两个相同就换&#xff0c;如果三个是回文也换&#xff0c;先看两个再看三个#include <bits/stdc.h> using namespace std; typed…

BZOJ 2768 [JLOI2010]冠军调查

还说还剩十分钟A一道水题&#xff0c;然后发现和善意的投票一模一样粘个代码过去直接A。。。 装作自己又写了一道题。 题面 //Twenty #include<cstdio> #include<cstdlib> #include<iostream> #include<algorithm> #include<cmath> #include<…

1420C1. Pokémon Army (easy version)

C1. Pokmon Army (easy version)&#xff1a;题目 题意&#xff1a;选择其中一部分&#xff0c;按照-依此计算&#xff0c;求总和 思路&#xff1a;找到局部最大值&#xff0c;然后减去局部最小值&#xff0c;依此找。#include <bits/stdc.h> using namespace std; type…

python学习笔记(五)缩进

python学习笔记&#xff08;五&#xff09;缩进 原作&#xff1a;http://www.cnblogs.com/vamei/archive/2012/05/29/2524706.html 笔记&#xff1a; #!/usr/bin/env python i 1 #把1赋值给i变量 x 2 #把2赋值给x变量 if i > 0: #如果i大于1x x 1#执行x1 print (x)#输出…

1443B. Saving the City

B. Saving the City&#xff1a;题目 题意&#xff1a;1是炸弹&#xff0c;引爆的同时引爆i-1&#xff0c;i1&#xff0c;埋一个炸弹的成本为b,引爆的成本为a 思路&#xff1a;首先如果有炸弹&#xff0c;必须引爆一次&#xff0c;然后往后遍历&#xff0c;看是引爆还是接上的…

【OpenCV函数】轮廓提取;轮廓绘制;轮廓面积;外接矩形

FindContours 在二值图像中寻找轮廓 int cvFindContours( CvArr* image, CvMemStorage* storage, CvSeq** first_contour, int header_sizesizeof(CvContour), int modeCV_RETR_LIST, int methodCV_CHAIN_APPROX_SIMPLE, CvPoint offsetcvPoint(0,0) ); image 输入的 8-比…

【AtCoder Regular Contest 082】Derangement

【链接】点击打开链接 【题意】 在这里写题意【题解】 贪心。连续一块的p[i]i的话,对答案的贡献就应该为(这个连续块的长度1)/2;长度为1的也正确.(也即两两相邻的互换位置。)【错的次数】 0【反思】 在这了写反思【代码】 #include <cstdio> #include <iostream> #…

1618D. Array and Operations

D. Array and Operations&#xff1a;题目 之前写的了&#xff0c;直接上答案&#xff01; #include <bits/stdc.h> #define int long long #define pII pair<int, int> #define endl "\n" #define fast ios_base::sync_with_stdio(0), cin.tie(0), cou…

kendo 服务端排序

z折腾了一天。。 参考 &#xff1a;https://docs.telerik.com/kendo-ui/api/javascript/ui/grid#configuration-columns.sortable.compare 关键代码 parameterMap: function(data, type) {if(data.sort) {var sortObj data.sort[0];typeSort sortObj.dir;typeName sortObj.f…

416B. Art Union

B. Art Union&#xff1a;题目 思路&#xff1a;dp那味道来了#include <bits/stdc.h> using namespace std; typedef long long ll; vector<ll> a((int)6e5); vector<ll> b((int)6e5); int g[50051][11]; int main() {int m,n;//画的数量&#xff0c;和画家…

Windows下编译TensorFlow1.3 C++ library及创建一个简单的TensorFlow C++程序

由于最近比较忙&#xff0c;一直到假期才有空&#xff0c;因此将自己学到的知识进行分享。如果有不对的地方&#xff0c;请指出&#xff0c;谢谢&#xff01;目前深度学习越来越火&#xff0c;学习、使用tensorflow的相关工作者也越来越多。最近在研究tensorflow线下采用 pytho…

665C. Simple Strings

C. Simple Strings&#xff1a;题目 思路&#xff1a;简单的离谱&#xff0c;就相同就换就行&#xff0c;哪有dp的事啊#include <bits/stdc.h> using namespace std; typedef long long ll; vector<ll> a((int)6e5); vector<ll> b((int)6e5); string str; i…

798B. Mike and strings

B. Mike and strings&#xff1a;题目 思路&#xff1a;纯暴力题&#xff0c;不想写&#xff0c;copy了别人代码#include<iostream> #include<string> using namespace std; void change(string &s){ss.substr(1)s.substr(0,1); } int main(){int n;cin>&g…

jquery ajax 数据传输

在 form表单中&#xff0c;需要发送给后台的是一串长数据&#xff0c;后台才能接受&#xff0c;而用户则只需要输入字符串中的一部分&#xff0c;这种情况下&#xff0c;就需要将用户输入内容&#xff0c;和剩余部分进行拼串&#xff0c;然后添加进 formData 中传输。另一种情况…