【发布时间】:2011-10-12 14:04:53
【问题描述】:
编译器:linux 上的 clang++ x86-64。
我已经有一段时间没有编写任何复杂的低级系统代码了,我通常针对系统原语(windows 和 pthreads/posix)进行编程。所以,in#s和out的已经从我的记忆中溜走了。我目前正在与boost::asio 和boost::thread 合作。
为了模拟针对异步函数执行器的同步 RPC(boost::io_service 具有多个线程 io::service::run'ing,其中请求是 io_serviced::post'ed),我使用了 boost 同步原语。出于好奇,我决定 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 的应用程序
这种水平的可移植性开销似乎很荒谬,有人可以证明这一点吗?据我所知,这些原语应该是 4 或 8 字节宽,具体取决于 CPU 的内存模型。
【问题讨论】:
-
你怎么能解释这些类型是“臃肿”的可移植性,而不是例如。功能?
-
这很可能是,但是,从文档来看,功能并没有超出系统特定库允许您做的事情。如果您认为这是由于功能问题,请为它提出论据作为答案:D
标签: c++ boost-asio boost-thread micro-optimization systems-programming