В чем разница между объявлением константы Global или объявлением внутри функции, в которой она используется

я объявляю константу (большую структурную константу, содержащую строку) внутри функции, и она используется только внутри этой функции.
Повлияет ли это на мою программу? ‘
Они будут создаваться каждый раз, когда вызывается функция (займет больше времени) или только один раз, и ссылка будет использоваться в течение всей ее жизни.
Если я объявлю константу вне функции (глобальную), будет ли она быстрее выполняться?

-1

Решение

На самом деле, объявление переменных внутри функции — отличная практика. Если эта переменная предназначена только для использования внутри этой функции, конечно. Между этими двумя методами не будет никаких различий в производительности, но для создания постоянного глобального значения может потребоваться более креативная схема именования, в то время как схема внутри функции может быть общей. В конце концов, он используется только внутри этой функции.

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

Я бы лично переместил его из тела функции, если любая другая связанная функция использует переменную, если вы используете пространства имен.

Также, если это истинная константа, я думаю, что вы можете объявить 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

В Аде это зависит от компилятора. (Так как производительность обычно есть.)

Поскольку «константы» не являются статичными во время компиляции, компилятор может делать безопасные вещи и вычислять инициализирующее выражение каждый раз, когда константа объявлена.

Если это действительно имеет значение, измерьте, что делает ваш компилятор.

1