我在几个函数中定义了很多常量数组。类似于以下内容:
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