求教phpstorm 数组对齐的内存对齐问题

关于求教数组的内存对齐问题的搜索推荐 -DotNet-TryCatch
>> 相关推荐
关于的搜索推荐
本人有如下烂代码: 1,chara[10],b[1]; 发现b的起始地址不是16的倍数,怎样才能整到它以16字节对齐方式开始呢?
还有以下更烂的代码: 2,typedefstructabc{      chard[3]; } 同样我希望成员d是以16字节对齐方式开始,咋整呢?
谢谢各位高人啦!
兄弟,成不成都给个话啊!这样吊着我很难受啊!如果不成,我就死了这条心了。
#pragmapack(push,16)
chara[10],b[1];
typedefstructabc{      chard[3]; }
#pragmapack(pop)
这种字节对齐的方法我以前在thunk中用过,最近看了嵌入式系统开发,里面用这个也挺多。
/view/2317161.htm
内存对齐记得是和cpu有关吧
和语言没关系
可以看看这篇文章参考一下
VC中内存对齐规则
不成啊,有没有哪位老大在机器上跑过,确实可行的办法呢? 我的机器上跑了,b[]的地址是0x00501d0a,不是16字节对齐.
引用6楼gzamao的回复:
不成啊,有没有哪位老大在机器上跑过,确实可行的办法呢? 我的机器上跑了,b[]的地址是0x00501d0a,不是16字节对齐.
起始地址不一定是16的倍数,你难道没看这里的说明吗 /view/2317161.htm
再顶一下,难道VC就申明不了一...
在实现静态int数组堆栈时,如果取得了内存中的这么一块内存,地址从,那么数组中0~n-1个下标对应的元素是0对应,1对。。。这样依...
#include &iostream&#include &cstdlib&#include &ctime&void ProduceRandomString(int* &X, int* &Y, const in...
最近发现自己C的基础实在是捉襟见肘啊...在51中执行一系列动作 并通过串口发送一串char反馈操作成功或失败了但是这两个数组分配在RAM中貌似太占内存了请教各位 可...
关于文件对齐值和内存对齐值对这个概念不是很懂我是这样理解的假设这个值为1000H如果第一个section的起始地址为401000 (字节少于1000)第二个section的起始地址...
很多网络协议都有发送规定的字符串过去,都明确规定了第几个字节(或者叫字段)表示什么意义。按理说既然有各个字段,用结构体表示很合抽象逻辑。可是结构体有内...
我在别的论坛看到过对内存对齐的讨论,但是对这样的声名顺序导致内存大小不一样的情况没讨论出结果来,高手指点下?代码:#include &stdio.h&typedef stru...
5undefined_instruction:get_bad_stackbad_save_user_regsbl do_undefined_instruction.align5software_interrupt:get_bad_stackbad_save_user_regsbl d...
#pragma pack(4)struct STR{
// 这里为什么是2起始???};struct STR_2{
//4起始(第4个...
结构体:typedef struct_t {
//U32 :unsigned intU32t1;U32t2;U32t3;U32t4;U32t5;U32t6;} T_TT_T//赋值test.t1
= 0x0000000A;test.t2
#include &iostream&class base{public:private:};void main(){cout&&sizeof(ba...
#include&iostream&class B{
~B();};class A5{
内存对齐的基本概念我知道,其作用我也明白,我想知道的是使用#pragma pack(n)的具体作用。1.在32bit系统上,cpu在访问内存的时候,是固定的每次访问4Bytes,还是...
什么叫4字节对齐,什么叫8字节对齐,这里的4和8是怎么来的?按4(8)字节对齐是怎么个对齐法?
------------
楼主看看这篇文章~~/nawin...
typedef union u{
char c[5];}typedef struct data{}sD
sizeof(sData) 24
为什么啊?
------------
之前不知道有这么回事 = =! 汗看见一书,struct foo{
char c2;};其中c1 s c2 i 相对于foo的起始地址的偏移量分别为多少?如果改成...查看: 2829|回复: 3|关注: 0
求助:MatLab中数组的内存分配问题
<h1 style="color:# 麦片财富积分
新手, 积分 5, 距离下一级还需 45 积分
在Matlab中,可以通过预先给数组赋值来为数组分配内存空间,这样在程序中对数组的访问和操作是在整片内存空间中进行的,防止了内存碎片的产生,提高了代码效率。
我的问题是:我想要建立一个数组,但是在程序中这个数组的长度是可变的,知道其长度上限,想给它一片整片的内存空间使用,这该怎么实现啊??
哭求,各位大侠多多指点,在线等!
<h1 style="color:# 麦片财富积分
自顶一下,没有人知道吗?各位帮帮忙啊:) !!!
<h1 style="color:# 麦片财富积分
再顶一次:'(
<h1 style="color:# 麦片财富积分
最后顶一次吧,再没人回答就放弃了……
站长推荐 /3
Powered by欢迎加入我们,一同切磋技术。 &
用户名: &&&
密 码: &
共有 1094 人关注过本帖
标题:求教,子程序中为动态二维数组分配的内存,如何在主程序中销毁
等 级:新手上路
帖 子:16
结帖率:66.67%
&&已结贴√
&&问题点数:20&&回复次数:5&&&
求教,子程序中为动态二维数组分配的内存,如何在主程序中销毁
主程序中有一个二级指针**a,子程序my_alloc为其分配内存,然后再在主程序中free分配的内存,如下:程序代码:#include &stdio.h&
#include &stdlib.h&
void my_alloc(double **a)
&&& a = malloc(sizeof(double) * <font color=#);
&&& for (i = <font color=#; i & <font color=#; i++)
&&&&&&&&a[i] = malloc(sizeof(double) * <font color=#);
int main(void)
&&& double **a;
&&& my_alloc(a);
&&& puts(&allocate memory ok&);
&&& for (i = <font color=#; i & <font color=#; i++)
&&&&&&&&free(a[i]);
&&& free(a);
&&& puts(&release memory ok&);
&&& return EXIT_SUCCESS;
该程序会在运行到free(a[i])提示段错误。
请问,这是什么原因,我该如何做才能在主程序中销毁a的内存。
[ 本帖最后由 hchuan 于
20:38 编辑 ]
搜索更多相关主题的帖子:
&&&&&&&&&&
等 级:新手上路
帖 子:15
首先你用malloc函数分配了动态内存,当需要取消动态内存分配是用fflush函数释放它,这个函数名我好像记错了,你查一下,嘛
来 自:天外
等 级:论坛游民
帖 子:61
专家分:84
int main(void)
&&& double **a;
&&& my_alloc(a);//子函数中参数是2级指针,这里该用1级指针传递,你直接用名a,也就是地址,肯定会有段错误的。&&my_alloc(*a);
&&& puts(&allocate memory ok&);
&&& for (i = 0; i & 10; i++)
&&&&&&&&free(a[i]);
&&& free(a);
&&& puts(&release memory ok&);
&&& return EXIT_SUCCESS;
来 自:幻想乡
等 级:侠之大者
帖 子:240
专家分:484
my_alloc(a);
这里你传值了,按照你的设计应该是传址。
my_alloc声明为void my_alloc(double ***a);
*a = malloc(sizeof(double) * 10);
my_alloc(&a);
If you're not failing every now and again, it's a sign you're not doing anything very innovative.
来 自:幻想乡
等 级:侠之大者
帖 子:240
专家分:484
&&得分:10&
程序代码:#include &stdio.h&
#include &stdlib.h&
void my_alloc(double ***a)
&&& *a = malloc(sizeof(double) * <font color=#);
&&& for (i = <font color=#; i & <font color=#; i++)
&&&&&&&&(*a)[i] = malloc(sizeof(double) * <font color=#);
int main(void)
&&& double **a;
&&& my_alloc(&a);
&&& puts(&allocate memory ok&);
&&& printf(&%p\n&, a);&&&&&&&&// 这句 printf 可以让你看到 a 是否为有效指针
&&& for (i = <font color=#; i & <font color=#; i++)
&&&&&&&&free(a[i]);
&&& free(a);
&&& puts(&release memory ok&);
&&& return EXIT_SUCCESS;
最后输出:
allocate memory ok
release memory ok
If you're not failing every now and again, it's a sign you're not doing anything very innovative.
等 级:新手上路
帖 子:16
我明白了,谢谢楼上几位的指点
版权所有,并保留所有权利。
Powered by , Processed in 0.045648 second(s), 8 queries.
Copyright&, BCCN.NET, All Rights Reserved博客访问: 204870
博文数量: 26
博客积分: 542
博客等级: 下士
技术积分: 358
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: C/C++
一. 计算机为什么要使用内存对齐机制?
1、平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
2、性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。访问未对齐的内存,处理器需要作两次内存访问,而对齐的内存访问仅需要一次访问。(提高对数据的读取效率,以空间换时间)
二. 对齐规则
&&&&1、每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。比如32位windows平台下,VC默认是按照8&bytes对齐的 (VC->Project->settings->c/c++->Code&Generation中的truct&member&alignment 值默认是8),程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16 来改变这一系数,其中的n就是你要指定的“对齐系数”。
& &&(1).数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。
& &&(2).结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。
& &&(3).结合1、2颗推断:当#pragma pack的n值等于或超过所有数据成员长度的时候,这个n值的大小将不产生任何效果。
示例: 所用编译器包括GCC 3.4.2和VC6.0的C编译器,平台为Windows XP + Sp2
&&&&1.字节对齐 (#pragma pack(1)),&输出结果:sizeof(struct test_t) = 13 [两个编译器输出一致]
&&&&分析过程:
&&&&&&&&1) 成员数据对齐
&&&&&&&&&&&&struct test_t {
&&&&&&&&&&&&&&&& /* int型,长度4 > 1 按1对齐;起始offset=0 0%1=0;存放位置区间[0,3] */
&&&&&&&&&&&&&&&& /* char型,长度1 = 1 按1对齐;起始offset=4 4%1=0;存放位置区间[4] */
&&&&&&&&&&&&&&&& /* short型,长度2 > 1 按1对齐;起始offset=5 5%1=0;存放位置区间[5,6] */
&&&&&&&&&&&&&&&&char d[6]; /* char型,长度1 = 1 按1对齐;起始offset=7 7%1=0;存放位置区间[7,C] */
&&&&&&&&&&&&};/*char d[6]要看成6个char型变量*/
&&&&&&&&2) 整体对齐
&&&&&&&&&&&&整体对齐系数 = min((max(int,short,char), 1) = 1
&&&&&&&&&&&&整体大小(size)=$(成员总大小) 按 $(整体对齐系数) 圆整 = 13 &&/*13%1=0*/
&&&&2.字节对齐&(#pragma pack(2)),&输出结果:sizeof(struct test_t) = 14 [两个编译器输出一致]
&&&&分析过程:
&&&&&&&&1) 成员数据对齐
&&&&&&&&&&&&struct test_t {
&&&&&&&&&&&&&&&& /* int型,长度4 > 2 按2对齐;起始offset=0 0%2=0;存放位置区间[0,3] */
&&&&&&&&&&&&&&&& /* char型,长度1 < 2 按1对齐;起始offset=4 4%1=0;存放位置区间[4] */
&&&&&&&&&&&&&&&& /* short型,长度2 = 2 按2对齐;起始offset=6 6%2=0;存放位置区间[6,7] */
&&&&&&&&&&&&&&&&char d[6]; /* char型,长度1 < 2 按1对齐;起始offset=8 8%1=0;存放位置区间[8,D] */
&&&&&&&&&&&&};
&&&&2) 整体对齐
&&&&&&&&整体对齐系数 = min((max(int,short,char), 2) = 2
&&&&&&&&整体大小(size)=$(成员总大小) 按 $(整体对齐系数) 圆整 = 14&
&&&&&&2.&在嵌入式环境下,对齐往往与数据类型有关,特别是C编译器对缺省的结构成员自然对届条件为“N字节对齐”,N即该成员数据类型的长度。如int型成员的自然对界条件为4字节对齐,而double类型的结构成员的自然对界条件为8字节对齐。若该成员的起始偏移不位于该成员的“默认自然对界条件”上,则在前一个节面后面添加适当个数的空字节。C编译器缺省的结构整体的自然对界条件为:该结构所有成员中要求的最大自然对界条件。若结构体各成员长度之和不为“结构整体自然对界条件的整数倍,则在最后一个成员后填充空字节。
&&&&那么可以得到如下的小结:
& &&类型 & & & & & &&对齐方式(变量存放的起始地址相对于结构的起始地址的偏移量)
& &&Char&&&& & & & &偏移量必须为sizeof(char)即1的倍数
& &&Short&&& & & & &偏移量必须为sizeof(short)即2的倍数
& & &int&&&&& & & & &&偏移量必须为sizeof(int)即4的倍数
& &&float&&& & & & & &偏移量必须为sizeof(float)即4的倍数
& &double & &&& & &偏移量必须为sizeof(double)即8的倍数
&&&&&&各成员变量在存放的时候根据在结构中出现的顺序依次申请空间,同时按照上面的对齐方式调整位置,空缺的字节编译器会自动填充。同时为了确保结构的大小为结构的字节边界数(即该结构中占用最大空间的类型所占用的字节数)的倍数,所以在为最后一个成员变量申请空间后,还会根据需要自动填充空缺的字节,也就是说:结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。对于char数组,字节宽度仍然认为为1。
&&& 对于下述的一个结构体,其对齐方式为:
& & typedef&struct{&double m1;&&&char m2;&&int m3;&}Node1;
&&&&&&对于第一个变量m1,sizeof(double)=8个字节;接下来为第二个成员m2分配空间,这时下一个可以分配的地址对于结构的起始地址的偏移量为8,是sizeof(char)的倍数,所以把m2存放在偏移量为8的地方满足对齐方式,该成员变量占用 sizeof(char)=1个字节;接下来为第三个成员m3分配空间,这时下一个可以分配的地址对于结构的起始地址的偏移量为9,不是sizeof (int)=4的倍数,为了满足对齐方式对偏移量的约束问题,自动填充3个字节(这三个字节没有放什么东西),这时下一个可以分配的地址对于结构的起始地址的偏移量为12,刚好是sizeof(int), 由于8+4+4 = 16恰好是结构体中最大空间类型double(8)的倍数,所以sizeof(Node1) =16.
& &&typedef struct{&&& &&& &&&&}Node2;
&&&&&&成员a占一个字节,所以a放在了第1位的位置;由于第二个变量b占4个字节,为保证起始位置是4(sizeof(b))的倍数,所以需要在a后面填充3个字节,也就是b放在了从第5位到第8位的位置,然后就是c放在了9的位置,此时4+4+1=9。接下来考虑字节边界数,9并不是最大空间类型int(4)的倍数,应该取大于9且是4的的最小整数12,所以sizeof(Node2) = 12.
&&&&typedef struct{&& &&&&&}Node3;
&&&明显地:sizeof(Node3) = 8
&&&对于结构体A中包含结构体B的情况,将结构体A中的结构体成员B中的最宽的数据类型作为该结构体成员B的数据宽度,同时结构体成员B必须满足上述对齐的规定。
阅读(1906) | 评论(2) | 转发(1) |
相关热门文章
给主人留下些什么吧!~~
文章快捷地址:结构体对齐问题分析&/cpp/15.aspx关于成员对齐方式&/cpp/.aspx
推荐补充阅读,帮助深入理解。1.《关于成员对齐方式》&地址:C++技术网2.《结构体对齐问题分析》&地址:C++技术网
请登录后评论。

我要回帖

更多关于 c 内存对齐 的文章

 

随机推荐