我试图在 C 中初始化一个数组,GCC 正在为每个元素生成一个 mov 指令(如果要初始化的元素很多,这是一种低效的方法)。我将如何用数组数据加载内存并从中返回一个指针而不是用这种方式初始化?
6:array.c **** int a[]={1,2,3,4,5,9};
26 .loc 1 6 0
27 0008 C745E001 movl $1, -32(%rbp)
27 000000
28 000f C745E402 movl $2, -28(%rbp)
28 000000
29 0016 C745E803 movl $3, -24(%rbp)
29 000000
30 001d C745EC04 movl $4, -20(%rbp)
30 000000
31 0024 C745F005 movl $5, -16(%rbp)
31 000000
32 002b C745F409 movl $9, -12(%rbp)
32 000000
最佳答案
我相信以下内容回答了您的问题“我将如何使用数组数据加载内存并从中返回一个指针?”:
int a_data[] = {1,2,3,4,5,9};
int main() {
int *a = a_data;
}
编译为:
.data
a_data:
.long 1
.long 2
.long 3
.long 4
.long 5
.long 9
.text
main:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
movq %rsp, %rbp
.cfi_offset 6, -16
.cfi_def_cfa_register 6
movq $a_data, -8(%rbp)
leave
ret
.cfi_endproc
如您所见,值存在于数据段中,main()
只是获取指向数据的指针。
当然,如果你改变a[]
,下次你获取a_data
的地址时,这些改变仍然存在。如果您希望获得原始值,则应该制作 a_data
的副本,而不是简单地使用指向它的指针。
关于c - 有效地初始化 C 中的数组/数据 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8538121/