2017-08-31 157 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這是依賴編譯器。 (因爲性能通常是這樣。)

由於「常量」不是編譯時靜態的,因此編譯器可以在每次聲明常量時執行安全操作並評估初始化表達式。

如果真的很重要,請測量一下編譯器的功能。