gpt4 book ai didi

c++ - 使用业力生成器避免属性拷贝

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:41:46 25 4
gpt4 key购买 nike

我正在使用 karma生成大型结构的表示,但结构在生成期间被复制。我认为他们不需要,所以想知道如何避免它。

下面的快速示例打印“复制!”,因为目标结构被复制到 rule::generate 中:

namespace karma = spirit::karma;
namespace phoenix = boost::phoenix;

struct foo
{
foo() { }
foo( foo const &other ) { std::cout << "Copy!"; }
int f() const { return 42; }
};

std::string output;
typedef std::back_insert_iterator< std::string > iterator;
karma::rule< iterator, foo() > foo_rule =
karma::int_[ karma::_1 = phoenix::bind( &foo::f, karma::_val ) ];
foo my_foo;
iterator it( output );
karma::generate( it, foo_rule, my_foo );

我可以通过声明 foo_rule 来停止复制的属性引用:

karma::rule< iterator, foo &() > foo_rule

但这不适用于 vector [显然是 foo因此 s 是可复制的,但在 vector 构建时复制可能很便宜,但在生成时复制很昂贵:-)]

下面的示例打印“复制!”生成期间五次(即在 vector ctor 期间忽略拷贝); 10 次如果 foo_rule的属性不是引用:

std::vector<foo> my_vec_foo(5);
karma::rule< iterator, std::vector<foo>() > vec_foo_rule = *foo_rule;
karma::generate(it, vec_foo_rule, my_vec_foo);

让这两个规则都采用引用不会在 VC 2008 上使用 Boost 1.47 进行编译。也就是说,使用:

karma::rule< iterator, foo &() > foo_rule /* = ... */;
karma::rule< iterator, std::vector<foo> &() > vec_foo_rule /* = ... */;

我得到 extract_from_containerAttribute = std::vector<foo> 实例化和 Exposed=std::vector<foo> & .在 extract_from.hpp 的第 131 行,它试图形成 Exposed const &编译器在创建引用到引用时失败。

我觉得我遗漏了什么,所以非常感谢任何指点!

最佳答案

我相信你已经试过了,但我还是要说。您是否尝试过如下:

std::vector<foo> my_vec_foo(5);
karma::rule< iterator, std::vector<foo>&() > vec_foo_rule = *foo_rule;
karma::generate(it, vec_foo_rule, my_vec_foo);

更新 我刚刚用下面的代码片段(g++ 4.6 with Boost 1.47.0)测试了它。它确认上述工作。然而,有混淆的余地,因为 std::vector<foo> my_vec_foo(5)还将显示正在制作的 5 个拷贝。查看代码和输出中的 BIG LETTER 警告:

#include <boost/spirit/include/karma.hpp>
#include <boost/spirit/include/phoenix.hpp>

namespace karma = boost::spirit::karma;
namespace phoenix = boost::phoenix;

struct foo
{
foo() { }
foo( foo const &other ) { std::cerr << "Copy!\n"; }
int f() const { return 42; }
};

int main()
{
std::string output;
typedef std::back_insert_iterator< std::string > iterator;
iterator it( output );
karma::rule< iterator, foo&() > foo_rule =
karma::int_[ karma::_1 = phoenix::bind( &foo::f, karma::_val ) ];

foo my_foo;
karma::generate( it, foo_rule, my_foo );

std::vector<foo> my_vec_foo(5);

std::cerr << "\nSTART WATCHING NOW" << std::endl;

karma::rule< iterator, std::vector<foo>&() > vec_foo_rule = *foo_rule;
karma::generate(it, vec_foo_rule, my_vec_foo);
}

输出:

Copy!
Copy!
Copy!
Copy!
Copy!

START WATCHING NOW

关于c++ - 使用业力生成器避免属性拷贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8065842/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com