2

基本的に、VB6コードでWindows API関数を宣言する場合、この関数で宣言または使用する必要のあるこれらの多くの定数が付属しています。実際、通常、これらの定数のほとんどは使用されず、そのうちの1つのみを使用することになります。したがって、API呼び出しを行うときは、条件付きコンパイル引数を使用して、次のようなものを使用してこれら(およびその他のもの)を除外しています。

IncludeUnused = 0 : Testing = 1

(これは私が2つの条件付きコンパイル引数を設定する方法です(それらはデフォルトでブール型です)。

したがって、多くの未使用のものは次のように除外されます。

#If IncludeUnused Then
' Some constant declarations and API declarations go here, sometimes functions
' and function calls go here as well, so it's not just declarations and constants
#End If

また、VB6プロパティウィンドウの[作成]タブの[条件付きコンパイル引数]入力フィールドで宣言されたテストブール値を使用して、同様のラッパーを使用します。Testing Booleanは、テストモードのときにメッセージボックスなどを表示するために使用されます。もちろん、 Testingを0に設定すると(テスト中は明らかに1になります)、これらのメッセージボックスは削除されます(表示されません) 。 )。

問題は、IncludeUnusedTestingを0と1に、またはその逆に、合計4つの組み合わせを設定しようとしたことです。これらの値をどの組み合わせに設定しても、VB6EXEの出力EXEファイルサイズは変更されません。 !!Fast Codeを使用してネイティブコードにコンパイルする場合、およびSmall Codeを使用する場合は、常に49,152です。

さらに、 TestingIncludeUnusedの4つの組み合わせでpコードにコンパイルすると、ファイルサイズは常に32,768になります。

これは私を夢中にさせています。なぜなら、実際には変化が起こっていなくても、実際には変化が起こっていないと信じるようになっているからです。コードのセグメントがコンパイルから除外されても、ファイルサイズが同じであるのはなぜですか?何が欠けているか、間違っているのか、または何を誤って計算したのですか?

おそらくVB6が最終出力EXEに使用されていないコードを自動的にコンパイルしないというオプションを検討しましたが、これが含まれている場合はコンパイルされるという点で、これは真実ではないことをいくつかのソースから読みました(訂正してください私が間違っている場合)、そしてこれが正しい場合は、IncludeUnusedブール値を使用して未使用のコードを削除する必要はありません...?

誰かがこれらの考えに光を当てることができれば、私はそれを大いに感謝します。

4

4 に答える 4

5

サイズの違いが非常に小さく、exe のサイズが次の 512 または 1024 バイト アラインメントにパディングされている可能性があります。exe を zip で圧縮してみて、zip ファイルのサイズが異なるかどうかを確認してください。

于 2012-11-10T16:23:02.283 に答える
2

VB6 実行可能ファイルのサイズは 4KB ブロックにパディングされるため、コードの違いが小さい場合、実行可能ファイルに違いはありません。

于 2012-11-11T11:59:52.477 に答える
2

コンパイラの機能を誤解しています。VB6 コンパイラの出力はcodeです。定数は単なる値のプレースホルダーであり、コードではありません。コンパイラはそれらをシンボル テーブルに追加します。その後、定数を使用するコード内のステートメントに遭遇すると、定数をその値で置き換えます。そのステートメントは、定数を使用するか、ステートメントで値をハードコーディングするかに関係なく、まったく同じコードを生成します。

したがって、これは、定数を実際にどこでも使用しない場合、生成されたコードにまったく違いがないことを自動的に意味します。#If を使用して達成したことは、コンパイラのシンボル テーブルを小さく保つことだけです。これはほとんど意味のないことであり、コンパイル速度から得られる実際の利益は測定できません。シンボル テーブルはハッシュ テーブルとして実装され、O(1) の償却された複雑さがあります。

定数は、コードを読みやすくするためだけに使用します。また、必要に応じて定数値を簡単に変更できるようにします。#If を使用すると、実際にはコードが読みにくくなります。

于 2012-11-10T16:53:53.440 に答える
1

条件付きコンパイル ディレクティブでランタイム データをテストすることはできません。

これらのディレクティブは、リテラル値、演算子、および CC 定数で構成される式を使用します。定数値を設定する 1 つの方法は次のとおりです。

#Const IncludeUnused = 0
#Const Testing = 1

IDE テスト用のプロジェクト プロパティを介して定義することもできます。詳細については、そのダイアログの [作成] タブに移動し、[ヘルプ] ボタンをクリックしてください。

おそらく、ここで値を設定していますか?もしそうなら、これは答えではなく、後の読者のための単なる追加情報と考えてください.

#If...Then...#Else ディレクティブを参照してください。

于 2012-11-10T17:50:13.083 に答える