4

私は持っています

const int MAX_CONNECTIONS = 500;
//...
if(clients.size() < MAX_CONNECTIONS) {
    //...
}

MAX_CONNECTIONSの「正しい」選択を見つけようとしています。だから私はgdbとを起動しset MAX_CONNECTIONS = 750ます。しかし、私のコードはこの変更に応答していないようです。実行時にぶつかってしまったのに、コンパイル時にconstintが解決されたからなのかしら。これは正しいように聞こえますか?GDBを使用して、プログラムのコードを編集せずにこの効果を回避できる方法はありますか?500までウォームアップするのに少し時間がかかります。

4

2 に答える 2

3

コンパイラは、変数がconstであることを確認して、定数をアセンブリにインライン化し、生成されたコードに変数の値を実際に読み取らせていないと思われMAX_CONNECTIONSます。C++ 仕様は、プリミティブ型の変数が明示的にマークされconstている場合、その定数を変更しようとする試みは (1) 違法であるか、(2)未定義の動作が発生します。

GDB を使用してこのようなことを行いたい場合は、変数を最適化しないことをコンパイラーに示すのvolatileではなく、変数をマークすることを検討してください。constまたは、この情報を他のデータ ソース (たとえば、ファイル内の構成オプション) で制御して、値を変更するためにプログラムのメモリをその下から吹き飛ばさないようにします。

お役に立てれば!

于 2012-06-11T20:04:34.440 に答える
2

それが であることを伝えることでconst、値をロードするのではなく、可能であればコードに直接組み込む自由があることをコンパイラーに伝えています。割り当てられたコピーは、選択された特定の命令が即値を持つのではなく値をロードする必要がある場合、またはコンパイラによって省略される可能性があります。これは、標準語に欠ける少し大まかな答えですが、それが基本的な考え方です。

于 2012-06-11T20:06:51.113 に答える