我在函數內部聲明瞭一個常量(一個包含字符串的大型結構常量),它僅在函數內部使用。 它會對我的程序有任何執行時間的影響嗎? ' 每次調用函數時(需要更多時間)或者只有一次函數都會創建它們,並且參考將在整個生命週期中使用。 如果我在函數(全局)之外聲明常量,執行速度會更快嗎?常量聲明全局函數或聲明函數內部的區別
-1
A
回答
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這是依賴編譯器。 (因爲性能通常是這樣。)
由於「常量」不是編譯時靜態的,因此編譯器可以在每次聲明常量時執行安全操作並評估初始化表達式。
如果真的很重要,請測量一下編譯器的功能。
相關問題
- 1. 內部函數聲明是否安全?
- 2. 如何從函數內部聲明一個全局變量?
- 3. 從函數內部聲明全局變量?
- 4. Javascript中的正常函數聲明和內部返回塊函數聲明的區別
- 5. 在構造函數內部或外部聲明變量之間的區別?
- 6. 全局函數的手寫體聲明
- 7. Javascript - 函數聲明之間的區別
- 8. 斯卡拉:函數聲明的區別
- 9. JavaScript函數聲明之間的區別?
- 10. 外部函數局部聲明
- 11. 類/全局函數聲明C++
- 12. CoffeeScript聲明並使用全局函數
- 13. 聲明一個函數內部的全局對象(C++)
- 14. 聲明一個函數內部創建的全局結構
- 15. C++函數聲明常數變量
- 16. 無法聲明全局變量外部函數
- 17. 函數聲明
- 18. 聲明函數
- 19. 聲明函數
- 20. 函數內函數內聲明
- 21. 函數級常量 - 在函數頂部聲明?
- 22. 函數內聲明函數的範圍
- 23. JS函數聲明:在參數聲明
- 24. 函數或實例聲明?
- 25. C隱式聲明不同於內部函數聲明
- 26. 函數聲明或函數表達式
- 27. 函數的聲明
- 28. 堆棧變量或函數聲明
- 29. 「隱式函數聲明」與函數原始版本的區別
- 30. jQuery函數聲明說明
問這個問題並用C++,C和Ada標記問題沒有任何意義 - 它們是不同的語言,答案與例如: C或C++字符串文字(不需要運行時分配)和C++'std :: string(它們可以進行動態運行時分配)。因此,發佈一種語言並向我們展示您關心的細節中的惡魔代碼。 –