大きなファイルのファイルが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) {
...
}
}
に初期化します
ここでは、ヘッダファイル内でconst std::string st[2];
と宣言されている配列を除いて、不要な変数に不要なメモリを割り当てることはありません。
ここで、「arg = 0」は実行時関与です。いくつかの変数が実行時に依存しないが、コンパイル時にのみ対応する場合は、対応する.cpp
ファイルのプレースホルダの値を単に置き換えることになりますか?
私が間違っているところで私を修正してください。
ヘッダーまたはソースファイルで宣言して初期化するかどうかに関係なく、コンパイル時定数はほとんどの実装でデータセグメントに移動します。例えば、あなたは 'int a [] = {/ *大きな配列* /}'を持っているとします。 'a'は定数ではありませんが、まだ初期化されていますが、プログラムはまだロードしなければなりません。だからこの場合、私はそれが重要な違いをもたらすとは思わない。一方、変数がコンストラクタまたは他の手段によって実行時の実行を初期化する必要がある場合。それを関数にラップし、オンデマンドで作成する方がよいでしょう。 –
@YanZhou速い返信をありがとう。つまり、両方のコンパイル時にメモリを消費するのではなく、各.cppファイル内のプレースホルダを置き換えるだけなので、上記の方法はほぼ同じです。 – myDoggyWritesCode
いいえ、回答を記入してください。 –