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

标签 c arrays pointers gcc initialization

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

相关文章:

c - 在 C 中遍历堆栈

C:将多个区域读入数组并求最大值

c - 动态分配字符串数组

arrays - ionic 2/3 : Number Input from Alert

c++ - 将 `char []` 传递给接受 `std::string&` 的函数是好习惯吗

c - 在 C 中是否存在内存溢出或覆盖的情况?

c - macOS 上的 "Return type of main is not int"警告

c - 在运行程序的 shell 中发出命令

c++ - shared_ptr 空指针和赋值

c - 计算C中的字符串长度