最近看的一些关于Linux服务端方面的文章

写点C++ user defined literals的奇怪(正常)用途

 

之前写的围棋程序的测试中,我们常常需要vector< { Player, Point } > pieceToPlace。问题在于,如果我们硬编码这个vector,可读性很差:

pieceToPlace.emplace_back(Player::B, make_pair(2, 3));
pieceToPlace.emplace_back(Player::B, make_pair(2, 1));
pieceToPlace.emplace_back(Player::W, make_pair(1, 0));

通过User defined literal,我们可以做到这样:

 auto placeVec = getInput({
    {O,   1_B,   2_W,   4_W},
    {6_W, 3_B,   5_B,   7_W},
    {O,   O,     O,     8_B},
    {9_W, O,     O,     O}
});
for (auto &ele : placeVec) 
{
    cout << (ele.player == Player::B ? "B" : "W") << " " << ele.point.first << "," << ele.point.second << endl; 
}
/*
B 0,1
W 0,2
B 1,1
W 0,3
B 1,2
W 1,0
W 1,3
B 2,3
W 3,0
*/

继续阅读“写点C++ user defined literals的奇怪(正常)用途”

Strict alising的坑

1

int foo(int *x, long *y) {
  *x = 0;
  *y = 1;
  return *x;
}

会被优化成

foo2:   movl    $0, (%rdi)
        xorl    %eax, %eax
        movq    $1, (%rsi)
        ret

因为编译器会认为,<shttps://intmainreturn0.com/wp-admin/plugins.phptrong>两个不能alising的指针,一定不会指向同一块内存区域,所以会推断出结果一定是0

所以啊,之前网上很多(float *)(&int_var)然后乱搞的做法都容易爆炸……

继续阅读“Strict alising的坑”