小编nev*_*stn的帖子

在C++中创建对三元运算符结果的const引用是否安全?

这段代码中有一些非常明显的事情:

float a = 1.;

const float & x = true ? a : 2.; // Note: `2.` is a double

a = 4.;

std::cout << a << ", " << x;
Run Code Online (Sandbox Code Playgroud)

clang和gcc输出:

4, 1
Run Code Online (Sandbox Code Playgroud)

人们会天真地期望两次打印相同的值,但事实并非如此.这里的问题与参考无关.有一些有趣的规则决定了它的类型? :.如果两个参数的类型不同并且可以进行转换,则它们将使用临时的.该引用将指向临时的? :.

上面的示例编译得很好,在编译时可能会也可能不会发出警告,-Wall具体取决于编译器的版本.

这是一个例子,说明在看似合法的代码中出错这么容易:

template<class Iterator, class T>
const T & min(const Iterator & iter, const T & b)
{
    return *iter < b ? *iter : b;
}

int main()
{
    // Try to remove the const …
Run Code Online (Sandbox Code Playgroud)

c++ gcc ternary-operator c++11 clang++

23
推荐指数
1
解决办法
1341
查看次数

ubuntu的.pac文件 - 命令行

我在一个使用复杂代理设置的环境中,使用.pac文件来描述/解决它们.我想在这个环境中主要基于ubuntu设置一些VM和docker容器.典型的"系统 - >首选项 - >网络代理 - >应用系统范围"答案没有多大帮助,因为我无法访问UI.理想的解决方案将适用于真正的全系统即工作,curl,wget,apt-get,pipmaven.有这样的解决方案吗?

ubuntu proxy docker

8
推荐指数
1
解决办法
4026
查看次数

用扭曲的文件读取文件到stdout

我们如何读取文件(非阻塞)并将其打印到标准输出(仍然是非阻塞的)?这是我能想到的最好的方式,但它让你觉得必须有更好的方法.暴露一些LineReceiver的东西 - 比如逐行修改 - 功能将更加优选.

from twisted.internet import stdio, protocol
from twisted.protocols.basic import FileSender
from twisted.internet import reactor

class FileReader(protocol.Protocol):
    def connectionMade(self):
        fl = open('myflie.txt', 'rb')
        d = FileSender().beginFileTransfer(fl, self.transport)
        d.addBoth(fl.close)
        d.addBoth(lambda _: reactor.stop())

stdio.StandardIO(FileReader())
reactor.run()
Run Code Online (Sandbox Code Playgroud)

python asynchronous twisted

7
推荐指数
1
解决办法
462
查看次数

多线程是否需要原子类型?(OS X,clang,c ++ 11)

我试图证明不使用std::atomic<>s 是一个非常糟糕的主意,但我无法创建一个再现失败的例子.我有两个线程,其中一个做:

{
    foobar = false;
}
Run Code Online (Sandbox Code Playgroud)

和另外一个:

{
    if (foobar) {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

类型foobar或者是bool或者std::atomic_bool和它的初始化true.我正在使用OS X Yosemite,甚至尝试使用技巧来提示我希望线程在不同内核上运行的CPU亲和性.我在循环等中运行这样的操作,无论如何,执行中没有可观察到的差异.我最终用clang检查生成的程序集,clang -std=c++11 -lstdc++ -O3 -S test.cpp我发现读取的asm差异很小(左边没有原子,右边没有原子):

在此输入图像描述

不,mfence或"戏剧性"的东西.在写作方面,会发生更具"戏剧性"的事情:

在此输入图像描述

如您所见,atomic<>版本xchgb使用了隐式锁.当我使用相对旧版本的gcc(v4.5.2)编译时,我可以看到mfence添加了各种各样的s,这也表明存在严重问题.

我有点理解"X86实现了一个非常强大的内存模型"(参考)并且mfence可能没有必要,但它是否意味着除非我想编写支持ARM的跨平台代码,否则我真的不需要atomic<>除非我关心ns级别的一致性,否则放任何s?

我看过"原子<>武器"从香草萨特,但我与它是多么的困难,以创建一个简单的例子,再现这些问题仍然印象深刻.

c++ multithreading gcc clang c++11

5
推荐指数
1
解决办法
478
查看次数

clang和gcc之间const参考三元运算符的地址差异

我对这里发生的事情有一个模糊的想法......它与此有关,但我想知道为什么clang ++和g ++处理这个问题的方式不同.这里的未定义行为在哪里?注意:这与模板无关 - 我只是使用它们来使示例更紧凑.这都是关于它的类型whatever.

#include <iostream>
#include <vector>

template <typename T>
void test()
{
    T whatever = 'c';


    const char a = 'a';

    std::cout << "begin: " << (void*)&a << std::endl;

    const char & me = (true ? a : whatever);

    std::cout << "ref:   " << (void*)&me << std::endl;
}

int main(int argc, char**argv)
{

    test<const char>();
    test<char>();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

gcc输出(测试高达4.9.3):

begin: 0x7fffe504201f
ref:   0x7fffe504201f
begin: 0x7fffe504201e
ref:   0x7fffe504201f
Run Code Online (Sandbox Code Playgroud)

clang 3.7.0输出:

begin: 0x7ffed7b6bb97
ref: …
Run Code Online (Sandbox Code Playgroud)

c++ gcc ternary-operator clang++

5
推荐指数
1
解决办法
142
查看次数