gpt4 book ai didi

c - 有效地初始化 C 中的数组/数据 block

转载 作者:太空宇宙 更新时间:2023-11-04 06:06:59 24 4
gpt4 key购买 nike

我试图在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com