编译器:linux上的clang++ x86-64。
自从我编写任何复杂的低级系统代码以来已经有一段时间了,我通常针对系统原语(windows 和 pthreads/posix)进行编程。所以,in#s和out的已经从我的记忆中溜走了。我正在boost::asio
和现在一起工作boost::thread
。
为了模拟针对异步函数执行器的同步 RPC(在请求被 ed 的地方boost::io_service
使用多个线程),我使用了 boost 同步原语。出于好奇,我决定使用原语。这就是我看到的。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 个字节???? ? 哇!条件变量为 88 !!! 请记住,我对这种臃肿的尺寸感到厌恶,因为我正在考虑一个可以创建数百个notification_object
's的应用程序
这种可移植性的开销水平似乎很荒谬,有人可以证明这一点吗?据我所知,这些原语应该是 4 或 8 字节宽,具体取决于 CPU 的内存模型。