none
『static __declspec(thread)』のOBJのサイズについて RRS feed

  • 質問

  • Microsoft Visual C++ 6.0を使用しています

    #include      "stdafx.h"
    extern  void  main    (void);
    static  __declspec(thread) char thr_buf[4096]; //①
    //static                   char thr_buf[4096]; //②
    ・
    ・
    ・
    void  main()
    {
    }
    

    上記のようなコードをコンパイルしてできた、OBJファイル(最終的にはEXEやDLL)のサイズが非常に大きくなってしまいます

    (『thr_buf[nnnn]』のサイズ分大きくなっているように感じます)

    『__declspec(thread)』  をはずし、②のようにコーディングするとファイルサイズが小さく(普通)なりました。

    コンパイルは、コマンドプロンプトより、行っています。(オプションは下記の通り)

    SET CL= /D_MBCS /DNDEBUG /DWIN32 /D_WINDOWS /D_AFXDLL /Ih:\jp\include /Ix:\res
    cl /Yustdafx.h /Fph:\jp\objw\stdafx.pch /Fox:\obj\ /c /MD /Zp1 /GX /O2 /W4 /J /Tp x:\apw\%1.cpp > x:\apw\%1.err

    プログラムを起動した時のメモリ使用量が増減するのは当たり前としても、『__declspec(thread)』を使用してもモジュールのサイズを小さくしたいと思っています。

    なぜ『__declspec(thread)』で記述すると、実行モジュールのファイルサイズが大きくなってしまうのか?また、小さくする方法を教えてください。

    よろしくお願いいたします。

    2012年11月1日 2:26

回答

すべての返信

  • ...all variables with the __declspec(thread) storage class are placed in the .tls section of a PE image...

    Thread Local Storage, part 3: Compiler and linker support for implicit TLS

    • 回答としてマーク KOMA 2012年11月1日 6:07
    2012年11月1日 3:26
  • 実行ファイルのサイズを減らしたいのならTlsAllocを使うとか、__declspec(thread)にはポインターだけを置き、それぞれの領域は実行時に確保するとか。
    で、どうでしょうか?

    • 回答としてマーク KOMA 2012年11月1日 6:07
    2012年11月1日 3:53
  • HomeCloset 様、佐祐理 様  ご回答ありがとうございました。
    大変参考になりました。

    蛇足ですが、
    static                   char thr_buf[4096]; //②
    ↓
    static                   char thr_buf[4096]="ABC"; //②
    

    とすると、『static  __declspec(thread) char thr_buf[4096]; //①』同様
    OBJサイズが大きくなりました。


    2012年11月1日 6:18
  • 前者はC言語仕様としてゼロで初期化されます。全部ゼロになることがわかっているため、OBJ / EXEにわざわざ領域を持たせない .bss セクションに配置されます。

    それに対して後者は "ABC" で初期化されるため、その情報が必要であり、 .data セクションに配置されます。

    2012年11月6日 6:07