这段代码中有一些非常明显的事情:
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) 我在一个使用复杂代理设置的环境中,使用.pac文件来描述/解决它们.我想在这个环境中主要基于ubuntu设置一些VM和docker容器.典型的"系统 - >首选项 - >网络代理 - >应用系统范围"答案没有多大帮助,因为我无法访问UI.理想的解决方案将适用于真正的全系统即工作,curl,wget,apt-get,pip和maven.有这样的解决方案吗?
我们如何读取文件(非阻塞)并将其打印到标准输出(仍然是非阻塞的)?这是我能想到的最好的方式,但它让你觉得必须有更好的方法.暴露一些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) 我试图证明不使用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?
我看过"原子<>武器"从香草萨特,但我与它是多么的困难,以创建一个简单的例子,再现这些问题仍然印象深刻.
我对这里发生的事情有一个模糊的想法......它与此有关,但我想知道为什么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)