我正在阅读linux内核,我发现了很多像这样的宏:
#define INIT_LIST_HEAD(ptr) do { \
(ptr)->next = (ptr); (ptr)->prev = (ptr); \
} while (0)
Run Code Online (Sandbox Code Playgroud)
为什么他们使用这个而不是简单地在{}中定义它?
当我正在阅读boost/shared_ptr.hpp时,我看到了这段代码:
// generated copy constructor, destructor are fine...
#if defined( BOOST_HAS_RVALUE_REFS )
// ... except in C++0x, move disables the implicit copy
shared_ptr( shared_ptr const & r ): px( r.px ), pn( r.pn ) // never throws
{
}
#endif
Run Code Online (Sandbox Code Playgroud)
注释"生成复制构造函数,析构函数是否正常,除了在C++ 11中,移动禁用隐式副本"是什么意思?我们是否总是自己编写副本来防止C++ 11中出现这种情况?
昨天我将我的域名服务器从cloudflare更改为dnspod.我用dig来测试它.但是,ANSWER SECTION始终是旧名称服务器.
;; AUTHORITY SECTION:
amazingjxq.com. 21336 IN NS kim.ns.cloudflare.com.
amazingjxq.com. 21336 IN NS brad.ns.cloudflare.com.
Run Code Online (Sandbox Code Playgroud)
ANSWER SECTION代表名称服务器吗?如果是这样,为什么不改变?
维基百科关于物理地址扩展的文章的摘录:
x86处理器硬件架构增加了用于选择附加内存的附加地址线,因此物理地址大小从32位增加到36位.理论上,这会将最大物理内存大小从4 GB增加到64 GB.
以及解释机制的图像:
但我看不出地址空间如何从4GB扩展到64GB.而4*512*512*4K仍然等于4GB,不是吗?
我正在读想要速度?通过价值.Dave Abrahams关于复制省略和RVO.而且我想知道为什么我们需要复制省略?
我被告知太多次你应该通过const引用传递函数参数以避免复制(我读过的几乎所有的c ++书都告诉我这个).
假设我们有两个功能:
int f1(const string &s);
int f2(string s);
Run Code Online (Sandbox Code Playgroud)
如果实际参数是右值,则在两个函数中都将避免复制.但如果实际参数是左值,则只能在f1中避免复制,而不是在f2中.那么为什么我们需要这个功能呢?
鉴于文件如下所示:
1440927 1
1727557 3
1440927 2
9917156 4
Run Code Online (Sandbox Code Playgroud)
第一个字段是ID in range(0, 200000000)
.第二个字段代表一种类型,即in range(1, 5)
.类型1和类型2属于公共类别S1
,而类型3和类型4属于公共类别S2
.一个ID可能有几个不同类型的记录.该文件大小约为200MB.
问题是计算具有类型1或2的记录的ID的数量,以及具有类型3或4的记录的ID的数量.
我的代码:
def gen(path):
line_count = 0
for line in open(path):
tmp = line.split()
id = int(tmp[0])
yield id, int(tmp[1])
max_id = 200000000
S1 = bitarray.bitarray(max_id)
S2 = bitarray.bitarray(max_id)
for id, type in gen(path):
if type != 3 and type != 4:
S1[id] = True
else:
S2[id] = True
print S1.count(), S2.count()
Run Code Online (Sandbox Code Playgroud)
虽然它给出了答案,但我认为它运行得有点慢.我该怎么做才能让它跑得更快?
编辑:
文件中有重复的记录.我只需要区分S1(类型1和类型2)和S2(类型3和类型4).例如,1440927 1
并且 …
我使用下面的代码来测试copy elision:
class foo
{
public:
foo() {cout<<"ctor"<<endl;};
foo(const foo &rhs) {cout<<"copy ctor"<<endl;}
};
int g(foo a)
{
return 0;
}
int main()
{
foo a;
g(std::move(a));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我预计只会调用默认构造函数,因为参数g()
是一个右值,副本将被省略.但结果显示默认构造函数和复制构造函数都被调用.为什么?
如果我将函数调用更改为g(foo())
,则复制将被删除.foo()
和的返回类型有什么区别std::move(a)
?如何在左值上编译编译器?
我有两个大文件.他们的内容如下:
134430513
125296589
151963957
125296589
该文件包含未排序的ID列表.某些ID可能会在单个文件中出现多次.
现在我想找到两个文件的交集部分.这就是两个文件中出现的ID.
我刚把这两个文件读成2套,s1
并且s2
.并获得交叉点s1.intersection(s2)
.但它消耗大量内存并且看起来很慢.
那么有没有更好的或pythonic方式来做到这一点?如果文件中包含许多无法读入set
内存有限的ID,我该怎么办?
编辑:我使用生成器将文件读入2组:
def id_gen(path):
for line in open(path):
tmp = line.split()
yield int(tmp[0])
c1 = id_gen(path)
s1 = set(c1)
Run Code Online (Sandbox Code Playgroud)
所有id都是数字的.并且最大id可能是5000000000.如果使用bitarray,它将消耗更多内存.
我正在读书Javascript:The Good Parts.我对以下代码感到困惑.
Function.method('curry', function ( ) {
var slice = Array.prototype.slice,
args = slice.apply(arguments),
that = this;
return function ( ) {
return that.apply(null, args.concat(slice.apply(arguments)));
};
});
Run Code Online (Sandbox Code Playgroud)
哪里null
的slice.apply(arguments)
?