假设你有一个静态数组作为library(data.table)
setDT(df)[, .(rbi=sum(rbi)), by= .(year, team)]
# year team rbi
#1: 2001 NYY 78
#2: 2001 BOS 55
#3: 2002 DET 77
struct
...初始化等等......
现在结构中的静态数组被认为是在堆还是堆栈上?另外,在结构中使用具有指定大小的数组与动态分配的数组相比更高效,即一旦指定动态内存就指向动态内存的指针,属于分配时间的属性?如果它在堆栈上,那么当结构被释放时,堆栈是否会消除变量?
答案 0 :(得分:4)
您正在使用malloc函数来分配内存 因此,使用malloc函数为任何变量或结构分配内存,它将仅在堆中分配内存。 你声明一个变量“a”,这是结构的成员。所以,在这里你没有分配内存。你只需要声明一个结构。 之后使用malloc分配内存,此处只有内存将在堆中分配。
答案 1 :(得分:0)
在你的代码中struct example
的大小为5个字节,其中包含字符数组。使用malloc
命令,您已经分配了5个字节,其中包含完整的结构。 malloc
将从堆中分配内存。字符数组array
是分配内存的第一个(也是唯一的)5个字节。
鉴于这是一个少量的内存,你可能只想要一个堆栈变量来保存它而不是分配堆。如果您仅在功能期间使用它。在这种情况下,你可以简单地去:
struct example exp;
现在这只是堆栈上的一个结构,所以没有用于分配它的开销。当然,如果这是一个庞大的结构,那么这样做是不明智的。
答案 2 :(得分:-1)
数组是结构的一部分。无论结构在哪里,数组都在其中。
如果使用堆,则与分配可变大小的数组没有什么不同。实际上,您可以增加分配的大小,它会为数组提供更多空间。例如。如果你分配10个字节,你将能够在数组中使用10个元素 - array [0]到array [9]。反过来说,如果只分配2个字节,你仍然可以使用数组的2个元素 - array [0]和array [1]。因此,您指定的数字5仅适用于sizeof()。
当然,如果你将它用作堆栈中的局部变量,那就完全不同了。