プロが教えるわが家の防犯対策術!

gccでソースの改造でメモリ節約のため構造体サイズの圧縮を行っているのですが、
構造体定義が#defineマクロの塊になってしまっているのでサイズの見当がつかなくて
困っています。
sizeofの値をコンパイル時のエラーメッセージ出力などを使って出力できれば、
実装してターゲットでprintf()を動かさなくてもいいので助かるのですが、プリ
プロセス命令の組み合わせとかでどうにかならないでしょうか?

A 回答 (3件)

ターゲットにも依存しますが、次のようにすれば、おそらくサイズを知ることができると思います。



#define PRINT_SIZEOF(type) PRINT_SIZEOF_(type, __LINE__)

#define PRINT_SIZEOF_(type, line) \
 void print_sizeof_##line() { asm volatile("size of " #type " is %0" :: "g"(sizeof(type))); }

PRINT_SIZEOF(struct foo)

Cのソースに上記のように書いておけば、アセンブルの段階で、

Error: no such instruction: `size of struct foo is $123'

というエラーが発生します。$123のところがstruct fooのバイト数です。
__LINE__マクロを使っているのは、同じソースファイルの中で、複数のPRINT_SIZEOFを使えるようにするためです。
    • good
    • 2
この回答へのお礼

ありがとうございます。上手くいきました。
そういう使い方があるとは!
また質問する機会がありましたら、よろしくお願いします。

お礼日時:2005/12/07 08:56

#1です。



ちなみにC++であれば、もっと簡単になります。

template <typename T, int> struct type_;
#define PRINT_SIZEOF(type) inline void size_of_(type_<type, sizeof(type)>) {}

PRINT_SIZEOF(foo)

と書いてコンパイルすれば、

test.cc: In function `void size_of_(type_<foo, 123>)':
test.cc:6: error: `<anonymous>' has incomplete type
test.cc:3: error: declaration of `struct type_<foo, 123>'

のようなメッセージが出て、foo型が123バイトであることが分かります。
今回は、型が異なれば多重定義になるので、__LINE__を使った面倒なことはやめています。
    • good
    • 1

gcc -Sとしてアセンブラリストを出させてみるのはいかがでしょう。


サイズの埋め込みが分かりやすいように
int func(void)
{
return sizeof(hogehoge);
}
という関数を作っておけば、見つけやすいかと思います
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このQ&Aを見た人がよく見るQ&A