У меня есть файл Constants.h
, в котором объявлено и инициализировано около 200 переменных (в основном массивов). Я использую пространство имен.Слишком много декларации и инициализации в заголовочном файле C++
СПОСОБ 1:
//Constants.h
#ifndef CONSTANTS_H_
#define CONSTANTS_H_
namespace LibConstants
{
const int a = 12;
const std::string theme[2]; = {"themeA", "themeB"};
const int arr[2] = {1, 2};
// and around 200 more declarations with initialization
}
#endif
Этот .h
файл почти каждый .cpp
файл, но каждый раз, когда только очень минимальные переменные используется как LibConstants::theme[0]
#include
.
Мои способы работают нормально, но не он излишне выделяет память? Должен ли я следовать подходу, определять только переменные в файле .h
и инициализировать его в .cpp
?
Как и в ниже код: МЕТОД 2:
//Constants.h
#ifndef CONSTANTS_H_
#define CONSTANTS_H_
namespace LibConstants {
std::string getMyTheme(int arg);
std::string getMyThemeName(int arg);
const int a;
const std::string theme[2];
const int arr[2];
// and around 200 more declarations with initialisation
};
#endif
Инициирование в CPP файле
//Constants.cpp
#include LibConstants.h
using namespace LibConstants {
std::string getMyTheme(int arg) {
theme[2] = {"themeA", "themeB"};
return theme[arg];
}
std::string getMyThemeName(int arg) {
...
}
}
Используя его как
//HelloWorld.cpp
#include Constants.h
int main() {
//METHOD 1:
std::string a = LibConstants::theme[0]; // arg=0 is dynamic and is being read from localStorage in my case.
//METHOD 2:
std::string a = LibConstants::getMyTheme(0); //Here also arg=0 is dynamic.
...
}
Здесь ненужное выделение памяти для ненужных переменных не произойдет, за исключением массивов, объявленных как const std::string st[2];
в файле заголовка.
Здесь «arg = 0» - это время выполнения. Имеет ли значение, если какая-либо переменная не зависит от времени выполнения, а только время компиляции, в этом случае она просто заменит значение placeholder в соответствующем файле .cpp
?
Пожалуйста, исправьте меня везде, где я ошибаюсь.
Константы времени компиляции относятся к сегменту данных в большинстве реализаций, независимо от того, объявляете ли вы и инициализируете их в заголовках или исходных файлах. Например, у вас есть 'int a [] = {/ * большой массив * /}'. 'a' не является константой, но его инициализация все равно должна идти куда-то, и программе все равно придется ее загрузить. Поэтому в этом случае я не думаю, что это имеет существенное значение. С другой стороны, если переменная требует выполнения выполнения во время выполнения, либо с помощью конструктора, либо с помощью других средств. Лучше обернуть его функцией и создать его по требованию. –
@YanZhou Спасибо за быстрый ответ. Итак, вы имеете в виду, что оба вышеописанных метода почти одинаковы, поскольку оба они являются временем компиляции и не потребляют память, а заменяют их заполнители в каждом .cpp-файле? – myDoggyWritesCode
№ Дайте минуту, чтобы составить ответ. –