小编Jus*_*tin的帖子

确定两个国际象棋位置是否相等

我正在为一个国际象棋变种引擎调试我的换位表,其中可以放置碎片(即最初不在板上).我需要知道我经常遇到关键的碰撞.我正在保存每个表索引中的片段列表以及通常的哈希数据.我确定两个位置是否相等的简单解决方案是转换失败,因为我是线性比较两个列表.

请不要建议我应该以板为中心而不是以件为中心进行存储.由于可放置和捕获的碎片的独特性,我必须存储碎片清单.这些状态中的碎片就像它们占据了重叠且无位置的位置.请查看存储片段的说明.

// [Piece List]
// 
// Contents: The location of the pieces.
//           Values 0-63 are board indexes; -2 is dead; -1 is placeable
// Structure: Black pieces are at indexes 0-15
//            White pieces are at indexes 16-31
//            Within each set of colors the pieces are arranged as following:
//            8 Pawns, 2 Knights, 2 Bishops, 2 Rooks, 1 Queen, 1 King
// Example: piece[15] = 6 means the black …
Run Code Online (Sandbox Code Playgroud)

algorithm chess

10
推荐指数
3
解决办法
2142
查看次数

c ++中的三向条件确定两个数字的符号等值

我需要最有效的方法(在cpu周期中)来确定两个数字是否具有相同/不同的符号.但问题是,如果任一数字为零,我需要能够将其与具有相同/不同符号的数字区分开(即,零被视为"第三"符号).以下代码与我需要的类似,但只要只有三个不同的返回值,返回值就可以是任何值.

int foo(int x, int y) {
    if (x * y > 0) return 1;
    if (x * y < 0) return -1;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

对于我的具体问题,值在[-6,6]范围内,并且X保证不为0.我找到了一个解决方案,找出两个数字是否具有相同的符号,并对其进行修改以获得以下解决方案.

return y? (((x^y) >= 0)? 1 : -1) : 0;
Run Code Online (Sandbox Code Playgroud)

应该有一些bitops /比较比使用乘法,分支,比较更快的结果.

c++ algorithm optimization performance

9
推荐指数
4
解决办法
2140
查看次数

为什么Clang强制结构参数为整数

在函数中使用struct参数时,clang将更改函数签名.签名将是一个相同大小的强制int,而不是使用结构类型.在我的编译器项目中,我使用llvm结构类型作为方法签名(这似乎更合乎逻辑).

这不会是一个问题,除了LLVM在使用struct或coerced类型时产生的汇编是不同的而不是调用兼容的事实.这导致我的编译器不与具有结构的C函数ABI兼容.

为什么clang这样做?这是C ABI中指定的内容吗?

这是一个简单的示例C源文件:

struct TwoInt { int a, b; };

struct EightChar { char a, b, c, d, e, f, g, h; };

void doTwoInt(struct TwoInt a) {}

void doEightChar(struct EightChar a) {}

int main()
{
        struct TwoInt ti;
        struct EightChar fc;

        doTwoInt(ti);
        doEightChar(fc);

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

从Clang得到的LLVM-IR

%struct.TwoInt = type { i32, i32 }
%struct.EightChar = type { i8, i8, i8, i8, i8, i8, i8, i8 }

define void @doTwoInt(i64 %a.coerce) nounwind uwtable {
  %a …
Run Code Online (Sandbox Code Playgroud)

compiler-construction struct abi llvm clang

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

将BSON转换为JSON时,禁用$ numberLong表示64位int值

我正在使用mongodb c ++ BSON库.我最近升级到使用mongodb 3.0,现在用64位整数序列化BSON给出:

{"time": {"$numberLong": "123"}}
Run Code Online (Sandbox Code Playgroud)

当我这样称呼时:

BSON("time" << time).jsonString()
Run Code Online (Sandbox Code Playgroud)

我的客户端代码无法处理这个,而是需要json:

{"time": 123}
Run Code Online (Sandbox Code Playgroud)

我如何获得mongodb 2.4的旧行为?

c++ json mongodb

7
推荐指数
0
解决办法
663
查看次数

C++:在对象范围外调用析构函数?

更新1:按建议添加打印"this".

更新2:拆分为多个文件以尝试阻止gcc优化.

更新3:记录的复制构造函数并输入添加功能.

更新4:添加了Clang的输出和main中的第二个cout.

我希望将参数析构函数作为函数中的最后一个语句来调用.从此以后,我希望下面的代码输出如下.

default constructor: 008DFCF8
other constructor: 008DFCEC
copy constructor: 008DFBC0
in member add
destroying: 008DFBC0
copy constructor: 008DFBB8
copy constructor: 008DFBB4
in function add
destroying: 008DFBB4
destroying: 008DFBB8
3 == 3
end of main
destroying: 008DFCEC
destroying: 008DFCF8
Run Code Online (Sandbox Code Playgroud)

使用MSVC(Visual Studio)时,输出是预期的.但GCC(4.8.2-19ubuntu1)输出以下内容,表明函数参数的析构函数是在main()中的第一个cout语句之后但在最后一个之前调用的.

default constructor: 0x7fff2fcea510
other constructor: 0x7fff2fcea520
copy constructor: 0x7fff2fcea550
in member add
copy constructor: 0x7fff2fcea540
copy constructor: 0x7fff2fcea530
in function add
3 == 3
destroying: 0x7fff2fcea530
destroying: 0x7fff2fcea540
destroying: 0x7fff2fcea550
end of …
Run Code Online (Sandbox Code Playgroud)

c++ destructor

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

确定两个列表是否包含相同的数字项而不进行排序

我有两个列表,我需要确定它们是否包含相同的值而不进行排序(即,值的顺序无关紧要).我知道排序可以工作,但这是性能关键部分的一部分.

项目值在[-2,63]范围内,我们总是比较相同大小的列表,但列表大小的范围是[1,8].

示例列表:

A = (0,   0, 4, 23, 10)
B = (23, 10, 0,  4,  0)
C = (0,   0, 4, 27, 10)

A == B is true
A == C is false
Run Code Online (Sandbox Code Playgroud)

我认为一个可能的解决方案是比较两个列表的乘积(将所有值相乘),但这个解决方案存在问题.如何处理零和负数.解决方法是在乘法之前为每个值添加4.这是我到目前为止的代码.

bool equal(int A[], int B[], int size)
{
    int sumA = 1;
    int sumB = 1;

    for (int i = 0; i < size; i++) {
        sumA *= A[i] + 4;
        sumB *= B[i] + 4;
    }
    return (sumA == sumB)
}
Run Code Online (Sandbox Code Playgroud)

但是,无论列表的顺序/内容是什么,这总是有效吗?换句话说,以下数学上是真的吗?所以我真正要求的是以下(除非有另一种方法来解决问题):

给出2个相同大小的列表.如果列表中的乘积(将所有值相乘)相等,则列表包含相同的值,只要这些值是大于0的整数即可.

performance

3
推荐指数
1
解决办法
237
查看次数

使用网络库的状态信息的TCP服务器

我正在为在线回合制游戏编写tcp服务器.我已经使用php套接字编写了一个原型,但是想转向C++.我一直在看流行的网络库(ASIO,ACE,POCO,LibEvent),但目前还不清楚哪一个最适合我的需求:

1)连接是持久的(大约几分钟),服务器必须能够处理100多个同时连接.

2)连接必须能够维护状态信息(用户登录信息).[我的php原型目前要求每个客户端请求包含登录信息]

3)可选地且优选地多线程,但是单个过程.不希望每个连接没有1个线程,而是在所有打开的连接上使用固定数量的线程.


我倾向于POCO的TCPServer或Reactor框架,但不确定它们是否符合我的要求.我认为Reactor是单线程的,TCPServer强制执行1:1线程/连接.我对么?


在任何一种情况下,我都不确定如何完成将登录信息与特定连接相关联的最重要任务,其中连接随机进出.

c++ poco ace boost-asio

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