2017-08-31 110 views
-1

我在函数内部声明了一个常量(一个包含字符串的大型结构常量),它仅在函数内部使用。 它会对我的程序有任何执行时间的影响吗? ' 每次调用函数时(需要更多时间)或者只有一次函数都会创建它们,并且参考将在整个生命周期中使用。 如果我在函数(全局)之外声明常量,执行速度会更快吗?常量声明全局函数或声明函数内部的区别

+3

问这个问题并用C++,C和Ada标记问题没有任何意义 - 它们是不同的语言,答案与例如: C或C++字符串文字(不需要运行时分配)和C++'std :: string(它们可以进行动态运行时分配)。因此,发布一种语言并向我们展示您关心的细节中的恶魔代码。 –

回答

1

实际上,在函数内声明变量是一种很好的做法。如果该变量仅用于该函数的内部。这两种方法之间不会有任何性能差异,但使全局不变可能需要更具创造性的命名方案,而函数内部的方法可能是通用的。毕竟,它只能在该功能中使用。

1

只要使用命名空间,我会亲自将其移出函数体,如果任何其他相关函数使用该变量的话。

此外,如果它是一个真正的常量,我相信你可以声明一个struct static constexpr,这意味着它不会在每次调用函数时都分配到堆栈上(静态),即使你在功能体。这也意味着它可以在编译时使用,它会是(constexpr)。

#include <iostream> 

namespace Test{ 
struct Test { 
    char name[11]; 
    int a; 
    int b; 
}; 

static constexpr Test TEST_CONSTEXPR = { 
    "test value", 
    5, 
    6 
}; 
} 

int main() 
{ 
    std::cout << Test::TEST_CONSTEXPR.name << std::endl; 
    std::cin.get(); 
    return 0; 
} 
1

static struct可以帮助您设置一次并完成它。这将来自数据段并在启动期间进行初始化。下面是一段粗俗而肮脏的代码,但会给你一些直觉。

#include <stdio.h> 

struct A { 
    int a; 
    int b; 
}; 

void func(void) 
{ 
    static struct A a = {5,3}; 
    printf("FUNC: A.a: %d\n", a.a); 
} 

int main(int argc, char **argv) 
{ 
    static struct A a = {6,4}; 
    printf("MAIN: A.a: %d\n", a.a); 
    func(); 
    return 0; 
} 
1

在Ada这是依赖编译器。 (因为性能通常是这样。)

由于“常量”不是编译时静态的,因此编译器可以在每次声明常量时执行安全操作并评估初始化表达式。

如果真的很重要,请测量一下编译器的功能。