C语言动态分配数组,栈可以动态分配吗
结构A {}
结构B { A a}
结构C { A a}
A*[]结构;
电子商务
init(b);
structs ~=cast(a*)b;错误:复制铸造(A*) b到分配内存中会逃逸b局部变量引用
排气量
init(c);
structs ~=cast(a*)c;
批处理进程(结构);//最后错误:复制铸造c到分配内存中会逃逸c局部变量引用
这样:cast(A*) b.a?
如果确实想把对象放置在堆中。动态数组提供乔治勋章拥有的内存。
以下程序交替把乙和丙放入缓冲区,然后批处理:
struct A { int I;}
结构B { A a}
结构C { A a}
A*[]结构;
空的追加(T,参数.)(ref ubyte[] structs,Args args) {
进口标准转换:安置;
structs.length=sizeWithPadding!t;
auto where=cast(T *)(structs[$-size with padding!t]);
炮位(其中,args);
}
void main() {
ubyte[]结构;
foreach(I;0 .10) {
如果(i % 2) {
structs.append!b(a);
}否则{
structs.append!c(A(I));
}
}
批处理进程(结构);
}
自动处理(T)(常量(字节)[]结构){
导入标准。stdio:writeln;
writeln(* cast(T *)结构。ptr);
返回结构【sizeWithPadding!T.$];
}
void batch _ process(const(ubyte)[]structs){
导入标准范围:空;
for(size _ t I=0;structs.emptyi ) {
如果(i % 2) {
structs=structs.process!b();
}否则{
structs=structs.process!c();
}
}
}
T * nextAlignedAddress(T)(T * candidateAddr){
导入标准特征;
静态if (is (T==class)) {
const alignment=类实例对齐!t;
}否则{
const alignment=T.alignof
}
const result=(cast(size _ t)candidateAddr alignment-1)
/对齐*对齐;
返回转换(T*)结果;
}
void * nextAlignedAddress(T)(void * candidateAddr){
返回nextAlignedAddress(cast(T *)candidateAddr);
}
size_t sizeWithPadding(T)() {
静态if (is (T==class)) {
const candidateAddr=_ _ traits(classInstanceSize,T);
}否则{
const candidateAddr=T.sizeof
}
返回cast(size _ T)nexalignedaddress(cast(T *)candidateAddr);
}从这里复制了nextAlignedAddress和sizeWithPadding函数。
我知道,垃集分配动态数组且禁止在垃集内存中保存局部变量引用,但是这里假设结构不会逃逸,可用固定大小数组实现:
A*[32]结构;
int I=0;
structs[I]=cast(a*)b;但是我想知道是否有具有最大容量限制可像普通动态数组一样连接的栈分配数组.
类似:
假设越狱者或其他人!
动态数组结构;
structs ~=cast(a*)b;这就是@可信的目的。也是为什么应小心使用它,并尽量最小化代码。
结构A {}
结构B { A a}
结构C { A a}
void main()
{
A*[]结构;
电子商务
排气量
()@可信{
structs ~=cast(a*)b;
structs ~=cast(a*)c;
} ();
}这是我要的,但为何
void func()@可信
{
A*[]结构;
电子商务
structs ~=cast(a*)b;//仍然错误
}不工作呢?
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。