假设有两个类的层次结构(class Derived: public Base).这两个类都有很大的内存占用和昂贵的构造函数.请注意,这些类中没有任何内容在堆中分配:它们只是有一个大的sizeof.
然后有一个具有快速路径(始终执行)和慢速路径(有条件地执行)的功能.快速路径需要一个Base实例,慢速路径需要一个Derived从现有基础构建的实例.此外,只有在快速路径之后才能做出慢速路径决定.
当前代码如下所示:
void f()
{
Base base;
/* fast path */
if (need_slow_path) {
Derived derived (base);
/* slow path */
}
}
Run Code Online (Sandbox Code Playgroud)
这是低效的,因为需要将基数复制到派生中; 基数也被分配两次,存在堆栈溢出的风险.我想要的是:
Derived例如,分配内存Base给它Derived在现有Base实例上调用ctor 并执行慢速路径在C++中有可能吗?如果没有,有哪些可行的解决方法?显然,我正在努力优化速度.
我正在开发一个C++解析器(用于IDE),所以现在尝试详细了解C++语法.虽然我在http://www.nongnu.org/hcb/找到了一个优秀的语法源,但我很难理解它的某些部分 - 特别是,哪些"真正的"语言结构对应于各种制作.
所以我正在寻找一个C/C++ BNF语法指南,其中包含与各种制作/规则相匹配的代码示例.有吗?
我正在使用STL关联容器(std::set和std::map)与持有std::unique_ptr<>实例的键.关键定义等同于以下内容:
struct Key
{
std::unique_ptr<Object> object;
bool operator== (const Key& rhs) const { return object->equal (*rhs.object); }
bool operator< (const Key& rhs) const { return object->less (*rhs.object); }
}
Run Code Online (Sandbox Code Playgroud)
众所周知,STL关联容器(特别是自C++ 11以来)没有办法获得对要移动的键的非const引用.我的密钥是不可复制的,所以c ++:从容器中删除元素并将其取回不起作用.
是否有非UB方法来克服这个问题?
我目前的解决方案如下:
template <typename T>
using map_pair_type = std::pair<typename T::key_type, typename T::mapped_type>;
template <typename T>
typename T::value_type take_set (T& container, typename T::iterator iterator)
{
typename T::value_type result = std::move (const_cast<typename T::value_type&> (*iterator));
container.erase (iterator);
return result;
}
template <typename T> …Run Code Online (Sandbox Code Playgroud) 我有一个 form 字符串FOO_123_BAR.bazquux,其中FOO和BAR是固定字符串,123是一个数字并且bazquux是自由格式的文本。
我需要对这个字符串执行文本转换:提取123和bazquux,增加数字,然后将它们排列在不同的字符串中。
例如,FOO_123_BAR.bazquux? FOO=124 BAR=bazquux. (实际转换更复杂。)
自然地,我可以在一系列 sed 和 expr 调用中做到这一点,但它很难看:
shopt -s lastpipe
in=FOO_123_BAR.bazquux
echo "$in" | sed -r 's|^FOO_([0-9]+)_BAR\.(.+)$|\1 \2|' | read number text
out="FOO=$((number + 1)) BAR=$text"
Run Code Online (Sandbox Code Playgroud)
是否有更强大的文本处理工具可以在一次调用中完成这项工作?如果是,那么如何?
编辑:我很抱歉没有更清楚地说明这一点,但输入和输出的确切结构是一个例子。因此,我更喜欢使用任何分隔符或不存在分隔符的通用解决方案,而不是依赖于例如存在下划线的解决方案。
在使用libxml ++(libxml2的C++包装器)时,我最近遇到了一个非常有趣的不一致.
该库使用默认STL列表容器(std::list<xmlpp::Node*>)返回节点列表.因为它是从默认存储库安装的,所以它似乎是在C++ 03模式下构建的(但我正在使用C++ 11).
这里需要注意的是C++ 11改变了方式std::list::size().
在C++ 03中,它是O(n),std::distance(begin(), end())每次调用- 现在它返回预先计算的值.
这是代码:
/** Returns the number of elements in the %list. */
size_type
size() const _GLIBCXX_NOEXCEPT
{
#ifdef __GXX_EXPERIMENTAL_CXX0X__
return this->_M_impl._M_size;
#else
return std::distance(begin(), end());
#endif
}
Run Code Online (Sandbox Code Playgroud)
当我从图书馆收到这样的清单并打电话时,情况就开始发生size()了.在那里我读取了像140734320138496这样的值,它清楚地表明了一个未初始化的计数器:在原始列表中完全没有计数器.当然,
手动呼叫std::distance (list.begin(), list.end())确实有效.
问题是 - 这可以被认为是GCC/libstdc ++中的一个错误,或者我永远不应该链接不同GCC模式中构建的可执行文件?
我有一个包含字段的 Python 类state。为了定义所有可能的状态,我声明了一个嵌套枚举:
class Foo:
class State(enum.Enum):
Unloaded = enum.auto()
Loaded = enum.auto()
Processed = enum.auto()
state: State
Run Code Online (Sandbox Code Playgroud)
不过这样写代码有点麻烦:
if foo.state == Foo.State.Unloaded:
do_something_with(foo)
foo.state = Foo.State.Loaded
Run Code Online (Sandbox Code Playgroud)
我想让枚举成员作为Foo(如Foo.Unloaded、Foo.Loaded和Foo.Processed)的成员直接访问。有没有比手动分配更好的方法?
class Foo:
class State(enum.Enum):
Unloaded = enum.auto()
Loaded = enum.auto()
Processed = enum.auto()
Unloaded = State.Unloaded
Loaded = State.Loaded
Processed = State.Processed
state: State
Run Code Online (Sandbox Code Playgroud)