典型例子:
void foo(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
// might throw, might not. who knows.
bar(fmt, args);
// uh-oh...
va_end(args);
}
Run Code Online (Sandbox Code Playgroud)
这是一个坏主意,即va_list在c ++中使用是不常见的吗?如果我bar用try-catch 包装,这有帮助吗?什么是替代品?
我有几个项目,我想在单独的构建配置中使用略有不同的配置:
而已.我查看了构建配置模板,但似乎不允许灵活地指定自定义构建步骤或额外的VCS根.
实际上,我只是希望不必手动将(几个)构建步骤从我们的初始项目的构建配置复制到几个更多的配置中,并且在事情发生变化时必须全部维护它们.似乎应该有更好的解决方案?
背景
我先前的问题有关boost.pool促使我详细调查boost.pool,现在我有一个补充问题,最后确定我的理解.
序幕
此参考说明了有关对象池模式的以下内容:
对象池模式是一种软件创建设计模式,它使用一组准备好使用的初始化对象,而不是按需分配和销毁它们.
据我所知,boost.pool(简化)通过内存分配和管理实现对象池模式,主要基于a的大小element_type,并返回一个指向已分配对象的简单指针:
element_type * malloc();
void free(element_type * p);
Run Code Online (Sandbox Code Playgroud)
一个简单的提升示例还表明,没有必要明确free获取的元素:
X * const t = p.malloc();
... // Do something with t; don't take the time to free() it.
Run Code Online (Sandbox Code Playgroud)
题
我知道在破坏池对象时可以安全地释放分配的内存,但是池如何知道客户端获取的内存块何时被释放回池中并且如果其接口提交直接指针则可以重用到element_type,但free()仍然不需要打电话?也就是说,如果无法确定内存是否仍在使用中,那么增强池如何重新使用此内存?如果它不重用这个内存,这甚至被认为是与wiki引用解释的模式相同的模式?
我有一个全局帮助函数,由头文件中的一堆宏使用.其意图是允许宏是通过简单地使用#include"荷兰国际集团的单头(换句话说,我想保持头中的函数定义并避免把它在一个单独的编译单元).但是,当应用程序#include将此文件存在于多个编译单元中时,这会导致问题,因为出现重复符号问题.
辅助函数具有足够的特性,不应在其中声明内联.
我搞乱了,发现使用未命名的命名空间解决了重复符号的问题,即:
namespace
{
void foo(...)
{
}
};
#define HELPER_A foo(1, ...);
#define HELPER_B foo(2, ...);
...
Run Code Online (Sandbox Code Playgroud)
这种方法有什么缺点吗?还有更好的选择吗?
考虑:
typedef boost::variant<T0, ..., TN> variant_T_t;
typedef boost::variant<U0, ..., UN> variant_U_t;
...
typedef boost::variant<variant_T_t, variant_U_t, ...> variant_t;
Run Code Online (Sandbox Code Playgroud)
这将对我的类型可以保留的类型数量的限制扩展到pow(BOOST_VARIANT_LIMIT_TYPES, L),其中L是嵌套级别的数量。
这(在某种程度上)是可以接受的解决方案,还是只是一个不好的hack?有更好的解决方案吗?也许老式union的比较合适?
我的印象是,a object pool是一种设计模式,用于管理客户端可以请求的一组预分配对象,并返回其中一个对象.然而,似乎boost.pool的object_pool类更多的是用较低级存储器管理不是目标管理.他们为什么选择这个名字,而不是像memory_pool?我是否认为boost的对象池实际上是一个内存池方案?或者它们基本上是一回事?另外,为什么还没有更高级别的对象池模式的标准实现?
特别考虑 C++string类构造函数规范,我们有:
string (const string& str, size_t pos, size_t len = npos);
string (const char* s, size_t n);
Run Code Online (Sandbox Code Playgroud)
它们本质上具有相同的形式/意图,除了 string 和 c-string。然而,异常规范却非常不同:
如果 pos 大于 str 的长度,则会抛出 out_of_range 异常。
如果 n 大于 s 指向的数组,则会导致未定义的行为。
我想知道这是为什么?除了性能之外,什么时候抛出异常与允许“未定义的行为”是一个好主意?答案似乎取决于以下因素:
考虑:
>> print max 5 6 7 8
6
== 8
Run Code Online (Sandbox Code Playgroud)
文档说明max只有两个参数,所以我理解第一行.但是从第二行看,解释器仍然能够找到任意数量的args的最大值.
这里发生了什么?返回的两个结果有什么区别?有没有办法捕获第二个?