コンパイラ: Linux での clang++ x86-64。
複雑な低レベル システム コードを作成してからしばらく経ち、通常はシステム プリミティブ (windows および pthreads/posix) に対してプログラムを作成しています。だから、in#s と out は私の記憶から抜け落ちました。私は現在、と一緒に働いていboost::asio
ますboost::thread
。
非同期関数エグゼキューターに対して同期 RPC をエミュレートするために (boost::io_service
複数のスレッドio::service::run
でリクエストが実行されるio_serviced::post
)、ブースト同期プリミティブを使用しています。好奇心のために、私sizeof
はプリミティブに決めました。これは私が見るものです。
struct notification_object
{
bool ready;
boost::mutex m;
boost::condition_variable v;
};
...
std::cout << sizeof(bool) << std::endl;
std::cout << sizeof(boost::mutex) << std::endl;
std::cout << sizeof(boost::condition_variable) << std::endl;
std::cout << sizeof(notification_object) << std::endl;
...
出力:
1
40
88
136
ミューテックスの 40 バイト ?? ?? ? なんてこった!condition_variable の場合は 88 !!! 私は何百notification_object
もの
移植性のためのこのレベルのオーバーヘッドはばかげているように思えますが、誰かがこれを正当化できますか? 私が覚えている限り、これらのプリミティブは、CPU のメモリ モデルに応じて 4 または 8 バイト幅である必要があります。