我在几个函数中定义了很多常量数组。类似于以下内容:

const float values[4] = {-4312.435f,  -432.44333f,  4.798, 7898.89};

检查完gcc汇编程序输出后,我注意到这些常量是在每次运行函数时生成的。那是相当低效的。我怀疑这是因为C/C++规范说即使数据是const,编译器也不能假设它不会被修改(例如,通过const_cast)。是否有可能迫使gcc另行考虑?

我想将这些常量定义在函数体内,因为它们非常复杂。将常数保持在使用位置附近可以极大地提高可维护性。

编辑

不幸的是,即使常量定义为static,它们也会在每次运行时重新生成。如果有帮助,我使用-O3。

EDIT2

好的,很抱歉第一次编辑,我需要进一步调查。似乎以前的特定设置以某种方式不允许gcc初始化常量而不重新生成它们。

EDIT3

问题出在我的测试用例中,我在附近定义了两个数组,但是其中一个打算生成。然后,汇编程序误导了我。再次抱歉,谢谢!

最佳答案

static关键字声明它们。

编辑:响应您的评论,以便向您展示一些代码:

这是预期的行为。您在做什么或看到不同的东西吗?

$ cat foo.c++
int main(void)
{
    static const float foos[] = {1.234f, 5.678f, 9.012f};
    return 0;
}
$ g++ -S foo.c++
$ cat foo.s
    .file   "foo.c++"
    .text
.globl main
    .type   main, @function
main:
.LFB0:
    .cfi_startproc
    .cfi_personality 0x3,__gxx_personality_v0
    pushq   %rbp
    .cfi_def_cfa_offset 16
    movq    %rsp, %rbp
    .cfi_offset 6, -16
    .cfi_def_cfa_register 6
    movl    $0, %eax
    leave
    ret
    .cfi_endproc
.LFE0:
    .size   main, .-main
    .section    .rodata
    .align 4
    .type   _ZZ4mainE4foos, @object
    .size   _ZZ4mainE4foos, 12
_ZZ4mainE4foos:
    .long   1067316150
    .long   1085649453
    .long   1091580199
    .ident  "GCC: (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5"
    .section    .note.GNU-stack,"",@progbits

09-04 17:43
查看更多