当前位置:首页 > 内存 > 正文

结构体申请内存

  • 内存
  • 2024-05-08 00:06:20
  • 3963

一、c++中给结构体分配动态内存的问题……用new吗怎么用?

在C++中,new用于为结构体分配动态内存。

示例:

structmystruct

{

inta;

charb;

mystruct*pMySrt=newmystruct;

a=1;

b='a';

cout<a<<""<b<

deletepMySrt;

扩展信息

使用C++中的新增功能

1.调用new运算符分配内存,operatornew(sizeof(A));

2.调用构造函数创建类对象,A::A();

3.返回对应的指针;

4.内存分配过程由new(size_t)运算符完成。A::operatornew(size_t)会被调用,否则会调用global::operatornew(size_t),这是C++默认提供的。


二、iOS-结构体内存分配

CGPoint是OC中的一个结构体,通常使用内存对齐来分配结构体。
1每个结构体成员相对于结构体首地址的偏移量是该成员大小的整数倍。
2结构总尺寸为结构最宽构件尺寸的整数倍。
3结构体变量的首地址可以除以最宽基类型成员的大小。
4对于成员属性包含结构体变量的复合结构体,在定义更广泛的基类型的成员时,必须包含复合类型成员的子成员。然而,当复合类型成员的偏移位置确定后,复合类型被视为一个整体。
5总结:结构体的大小等于最后一个成员的偏移量加上其大小加上末尾的填充字节数,即:sizeof(struct)=offsetof(lastitem)+sizeof(.lastitem)+sizeof(trailingpadding)

示例1:

第一个成员相对于结构体首地址的偏移量为0,为inti成员的整数倍(长度4)。
第二个成员相对于结构体首地址的偏移量为4,是该成员字符(长度1)的整数倍。(因为结构体的总大小是结构体最宽成员的大小的整数,如果结构体只有这两个成员,则在字符后面添加3个字节的填充,但现在有3个成员,所以不需要填充)
第三个成员相对于结构体首地址的偏移量是5,不是intx成员的整数倍,所以在x之前(或者c之后)填充3个字节。xShift达到8就变成了4的整数倍。所以这个结构体的内存大小就是4+1+3+4。

示例2:成员个数和每个成员类型相同,但顺序不同,内存大小不同。

示例3:复合结构体

#pragmapack(n)//编译器将按钮与N个字节对齐,并设置结构体成员的最大尺寸(与当前宽度成员相同)尺寸较小)。即结构体的最终长度是n的整数倍。
#pragmapack()//覆盖自定义范围。
#pragmapack(puch,1)//保存原来的对齐方式并设置新的对齐方式。
#pragmapack(pop)//恢复之前保存的对齐状态
预期#pragmapackparametertobe'1','2','4','8',or'16'
预期#pragmapack参数为“1”、“2”、“4”、“8”或“16”

演示

设置范围后的内存计算
1.当组跨度长度小于实际杆件长度时,杆件位移为杆件长度的整数倍。
2当spangroup的长度大于当前成员的长度且小于最长成员长度时,成员偏移量为指定span长度的整数倍。
3当span数组的长度大于最长成员长度时,成员偏移量将与当前成员的当前大小对齐。
4当跨度集的长度小于构件的实际长度时,结构的长度为指定跨度长度的整数倍。
5当spangroup的长度大于或等于当前最长成员长度时,结构体长度为当前成员长度的整数倍。


三、c#如何让结构体数组指向一段内存呀?在C#中,数组结构可以通过Global显示内存。具体实施步骤如下:
1.数组结构
MyStruct[]myStructArray;
//计算数组结构的大小
intstructSize=(typeof(MyStruct));
intarraySize=*structSize;2./申请一定量的内存
IntPtrarrayPtr=Global(arraySize);
//复制内存的数组结构
for(inti=0;i<;i++)
{
IntPtrdestPtr=newIntPtr(64()+i*structSize);
ureToPtr(myStructArray[i],destPtr,false);
}
```
3.=0;i<;i++)
{
IntPtrsrcPtr=newIntPtr(64()+i*structSize);
myStructArray[i]=(MyStruct)tructure(srcPtr,typeof(MyStruct));
}
```
4.;
```
在C#中创建指向内存的数组结构有上述几个步骤。