小编ama*_*jxq的帖子

当我们定义宏时,do while(0)有什么用?

可能重复:
C/C++宏中的Do-while和if-else语句

我正在阅读linux内核,我发现了很多像这样的宏:

#define INIT_LIST_HEAD(ptr) do { \
    (ptr)->next = (ptr); (ptr)->prev = (ptr); \
} while (0)
Run Code Online (Sandbox Code Playgroud)

为什么他们使用这个而不是简单地在{}中定义它?

c macros linux-kernel

125
推荐指数
2
解决办法
5万
查看次数

为什么epoll比选择更快?

我看过很多比较,其中说select必须遍历fd列表,这很慢.但为什么epoll不能做到这一点?

select epoll

53
推荐指数
2
解决办法
2万
查看次数

为什么用户定义的move-constructor会禁用隐式复制构造函数?

当我正在阅读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中出现这种情况?

c++ boost copy-constructor rvalue-reference c++11

38
推荐指数
2
解决办法
1万
查看次数

权威部分在挖掘结果中意味着什么?

昨天我将我的域名服务器从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代表名称服务器吗?如果是这样,为什么不改变?

dns dig

28
推荐指数
2
解决办法
4万
查看次数

PAE(物理地址扩展)如何启用大于4GB的地址空间?

维基百科关于物理地址扩展的文章的摘录:

x86处理器硬件架构增加了用于选择附加内存的附加地址线,因此物理地址大小从32位增加到36位.理论上,这会将最大物理内存大小从4 GB增加到64 GB.

以及解释机制的图像:

在此输入图像描述

但我看不出地址空间如何从4GB扩展到64GB.而4*512*512*4K仍然等于4GB,不是吗?

memory x86 memory-management

13
推荐指数
2
解决办法
6734
查看次数

什么时候应该通过const引用选择复制省略而不是传递参数?

可能重复:
C++ 11中的pass-by-value是否合理?

我正在读想要速度?通过价值.Dave Abrahams关于复制省略和RVO.而且我想知道为什么我们需要复制省略?

我被告知太多次你应该通过const引用传递函数参数以避免复制(我读过的几乎所有的c ++书都告诉我这个).

假设我们有两个功能:

int f1(const string &s);
int f2(string s);
Run Code Online (Sandbox Code Playgroud)

如果实际参数是右值,则在两个函数中都将避免复制.但如果实际参数是左值,则只能在f1中避免复制,而不是在f2中.那么为什么我们需要这个功能呢?

c++ rvalue lvalue rvo c++11

9
推荐指数
1
解决办法
1714
查看次数

如何提高这个计数程序的性能?

鉴于文件如下所示:

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并且 …

python performance bitarray

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

为什么复制elision不能使用std :: move?

我使用下面的代码来测试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)?如何在左值上编译编译器?

c++ gcc copy-constructor c++11

6
推荐指数
1
解决办法
2334
查看次数

如何使用python有效地找到两个大文件的交集?

我有两个大文件.他们的内容如下:

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,它将消耗更多内存.

python algorithm set

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

为什么apply()这里只需要一个参数而不是两个?

我正在读书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)

哪里nullslice.apply(arguments)

javascript

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