这完全没问题,因为新 ThreadSafeStack 的功能物有所值(函数调用)。
您的包装函数调用很可能会在适当的优化级别上内联,从而导致零开销。例如检查这种情况:指针解引用被包装成operator*
与原始指针解引用相同的汇编代码。许多级别的 C++ 抽象可以在优化过程中消失。
但是,虚函数调用不太可能被内联。因此,只要有意义就使用普通函数。
但是,如果我想将 std::mutex 包装到 MyMutex 类中以在调试时添加日志记录功能怎么办?
日志记录可能会增加一些可观的成本,但如果您仅在调试期间需要它 - 您可以通过ifdef
s 或任何其他方式在发布版本中安全地禁用它,例如:
const bool do_logging = false; // somewhere
// ...
if(do_logging) // branching can be easily removed by optimizer,
// because do_logging is constant
// ...
else
// ...
在您看来,值得还是不值得?
是的当然。基于标准库设施构建更有用的抽象是常见的做法。
如果我只是为了方便而做这样的事情,以避免在我的所有文件中写入 std:: 或 using::std 怎么办?你认为这很愚蠢吗?
这取决于您的项目 - 在某些情况下,甚至可以using namespace std
在头文件中使用。但请注意 - 包含此类标题的人可能会面临名称冲突。
在大多数情况下,可以using namespace std
在文件的开头.cpp
(在inlucde
s 之后)使用。但即使这是不可接受的,您也可以始终using
在函数级别使用指令:
void foo()
{
using namespace std;
// ...
}