在不使用auto或模板的情况下声明lambda变量或函数参数的符号是什么?有没有办法这样做?或者编译器是否为每个lambda定义一个唯一的类对象,其编程时间之前程序员的名称是未知的?如果是这样,为什么?它们不能仅作为某种函数指针传递吗?如果不可能,那将是一个很大的失望.
我一直在阅读有关新C++ 11内存模型的内容,并且我已经开始使用该std::kill_dependency功能(§29.3/ 14-15).我很难理解为什么我会想要使用它.
我在N2664提案中找到了一个例子,但它并没有多大帮助.
它首先显示代码而不是std::kill_dependency.这里,第一行将依赖性携带到第二行中,第二行将依赖性携带到索引操作中,然后将依赖性携带到do_something_with函数中.
r1 = x.load(memory_order_consume);
r2 = r1->index;
do_something_with(a[r2]);
Run Code Online (Sandbox Code Playgroud)
还有一个例子std::kill_dependency用于打破第二行和索引之间的依赖关系.
r1 = x.load(memory_order_consume);
r2 = r1->index;
do_something_with(a[std::kill_dependency(r2)]);
Run Code Online (Sandbox Code Playgroud)
据我所知,这意味着索引和调用do_something_with不是在第二行之前排序的依赖项.根据N2664:
这允许编译器将调用重新排序
do_something_with,例如,通过执行预测值的推测优化a[r2].
为了使得需要调用do_something_with该值a[r2].假设编译器"知道"数组填充了零,它可以根据需要优化该调用do_something_with(0);并相对于其他两个指令重新排序此调用.它可以产生以下任何一种:
// 1
r1 = x.load(memory_order_consume);
r2 = r1->index;
do_something_with(0);
// 2
r1 = x.load(memory_order_consume);
do_something_with(0);
r2 = r1->index;
// 3
do_something_with(0);
r1 = x.load(memory_order_consume);
r2 = r1->index;
Run Code Online (Sandbox Code Playgroud)
我的理解是否正确?
如果do_something_with通过其他方式与另一个线程同步,这对于x.load调用的顺序和另一个线程意味着什么?
假设我的描述是正确的,那还有一件事让我感到困惑:当我编写代码时,是什么原因导致我选择杀死依赖?
随着它的出现std::unique_ptr,瑕疵std::auto_ptr最终可以得到休息.所以在过去的几天里,我一直在改变我的代码以使用智能指针并delete从我的代码中消除所有代码.
虽然valgrind说我的代码是内存清晰的,但智能指针的语义丰富性将使代码更清晰,更易于理解.
在大多数代码中,转换很简单:std::unique_ptr用于代替拥有对象持有的原始指针,抛弃delete,仔细撒取get(),reset()并move()根据需要调用,以便与其余代码良好地连接.
我现在正在将非拥有原始指针转换为智能指针.
由于我小心对象的生命周期(我确保我的模块只依赖于一个方向),valgrind告诉我,我没有任何未初始化的读取,悬空指针或泄漏.所以,从技术上讲,我现在可以单独留下那些非拥有的原始指针.
但是,一种选择是将那些非拥有的原始指针更改为,std::shared_ptr因为我知道它们是非循环的.或者,将它们留作原始指针会更好吗?
我需要智能指针的资深用户提供一些建议,告诉你使用什么经验法则来决定是否保留非拥有的原始指针,或将它们翻译成std::shared_ptr,请记住我经常进行单元测试和valgrind我的码.
编辑:我可能误解了它的使用std::shared_ptr- 它们是否可以结合使用std::unique_ptr,或者如果我使用的话std::shared_ptr,所有句柄也应该是这样的情况std::shared_ptr?
允许用户向std命名空间添加显式特化.但是,有一些模板我明确禁止专业化.
我可以和不可以使用哪些模板?
有时局部变量的唯一目的是在assert()中检查它,就像这样 -
int Result = Func();
assert( Result == 1 );
Run Code Online (Sandbox Code Playgroud)
在Release版本中编译代码时,通常会禁用assert(),因此此代码可能会生成有关Result已设置但从未读取的警告.
可能的解决方法是 -
int Result = Func();
if ( Result == 1 )
{
assert( 0 );
}
Run Code Online (Sandbox Code Playgroud)
但它需要太多的打字,在眼睛上并不容易,并且导致总是检查条件(是的,编译器可以优化检查,但仍然).
我正在寻找一种替代方法来表达这个assert()的方式不会导致警告,但仍然易于使用并避免更改assert()的语义.
(在此区域代码中使用#pragma禁用警告不是一种选择,并且降低警告级别以使其消失也不是一种选择......).
在boost库中是否有一些与C++ 1x的std :: unique_ptr等效的类?我正在寻找的行为是能够拥有异常安全的工厂功能,就像这样......
std::unique_ptr<Base> create_base()
{
return std::unique_ptr<Base>(new Derived);
}
void some_other_function()
{
std::unique_ptr<Base> b = create_base();
// Do some stuff with b that may or may not throw an exception...
// Now b is destructed automagically.
}
Run Code Online (Sandbox Code Playgroud)
编辑:现在,我正在使用这个黑客,这似乎是我能在这一点上得到的最好的......
Base* create_base()
{
return new Derived;
}
void some_other_function()
{
boost::scoped_ptr<Base> b = create_base();
// Do some stuff with b that may or may not throw an exception...
// Now b is deleted automagically.
}
Run Code Online (Sandbox Code Playgroud) 虚拟析构函数声明后的覆盖标识符是否有任何特殊含义?
class Base
{
public:
virtual ~Base()
{}
virtual int Method() const
{}
};
class Derived : public Base
{
public:
virtual ~Derived() override
{}
virtual int Method() override // error: marked override, but does not override - missing const
{}
};
Run Code Online (Sandbox Code Playgroud)
在虚方法上使用覆盖标识符作为检查非常有用:当Base虚方法实际上未被覆盖时,编译器将报告错误.
虚拟析构函数上的覆盖是否也有任何含义/功能?
我有这个签名的第三方功能:
std::vector<T> f(T t);
Run Code Online (Sandbox Code Playgroud)
我还有一个已命名的潜在无限范围(范围-v3排序).我想创建一个映射到该范围的所有元素的管道,并将所有向量展平为包含其所有元素的单个范围.Tsrcf
本能地,我会写下面的内容.
auto rng = src | view::transform(f) | view::join;
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用,因为我们无法创建临时容器的视图.
range-v3如何支持这样的范围管道?
如何在JavaScript中使用索引器实现数组?.Net中有字典吗?
c++ ×8
c++11 ×6
.net ×1
arrays ×1
assertions ×1
bash ×1
boost ×1
dictionary ×1
exec ×1
javascript ×1
lambda ×1
memory ×1
memory-model ×1
overriding ×1
range-v3 ×1
shell ×1
std ×1
unique-ptr ×1
warnings ×1