小编Has*_*dev的帖子

在Game Boy上CP的进位标志的行为是什么?

Game Boy CPU Manual的第87页,声称该CP n指令在没有借位时设置进位标志,这意味着A < n.这似乎与自身发生冲突,因为进位标志设置时A > n.

例如:如果A=0B=1,则CP B设置标志,如SUB A, B0 - 1.这变为0 + 255 = 255并且未设置进位标志,即使如此A < B.

我在其他Z80文档中也遇到过同样的问题,所以我不相信这是一个错字.

我是否误解了借用和SUB工作的方式或是否有其他事情发生?是SUB不是等于ADD在标志方面补?

z80 gameboy

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

C++重载运算符,具有相反的关联顺序

很难想出一个标题......(我不是英语母语人士.)

struct A
{
    int value;
    A operator+(int i) const
    {
        A a;
        a.value=value+i;
        return a;
    };
};
int main(){
    A a;
    a.value=2;
    a=a+2;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

此代码按预期编译/工作,但是当我将a = a + 2更改为a = 2 + a时,它将不再编译.GCC给了我这个错误:

no match for ”operator+” in ”2 + a”
Run Code Online (Sandbox Code Playgroud)

有没有办法以某种方式使2 +工作就像+ 2?

c++ operator-overloading associativity

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

函数指针比内联函数运行得更快.为什么?

我在计算机上运行了我的基准测试(英特尔i3-3220 @ 3.3GHz,Fedora 18),并得到了非常意外的结果.函数指针实际上比内联函数快一点.

码:

#include <iostream>
#include <chrono>
inline short toBigEndian(short i)
{
    return (i<<8)|(i>>8);
}
short (*toBigEndianPtr)(short i)=toBigEndian;
int main()
{  
    std::chrono::duration<double> t;
    int total=0;
    for(int i=0;i<10000000;i++)
    {
        auto begin=std::chrono::high_resolution_clock::now();
        short a=toBigEndian((short)i);//toBigEndianPtr((short)i);
        total+=a;
        auto end=std::chrono::high_resolution_clock::now();
        t+=std::chrono::duration_cast<std::chrono::duration<double>>(end-begin);
    }
    std::cout<<t.count()<<", "<<total<<std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

用.编译

g++ test.cpp -std=c++0x -O0
Run Code Online (Sandbox Code Playgroud)

'toBigEndian'循环总是在0.26-0.27秒左右完成,而'toBigEndianPtr'则需要0.21-0.22秒.

更奇怪的是,当我删除'total'时,函数指针在0.35-0.37秒处变慢,而内联函数在约0.27-0.28秒.

我的问题是:

当'total'存在时,为什么函数指针比内联函数更快?

c++ performance function-pointers inline-functions

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

C++ 11'使用'类型别名的默认模板参数

我想为一个类型别名,以便在必要时可以给它一个模板参数.

template<typename T, unsigned d>
struct value
{
    T a[d];
};

template<typename T=float>
using val=value<T, 2>;

int main()
{
    val v;      //should now be equal to val<float> v;
    val<int> w; //should also be valid.
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

G ++因某些原因不赞成:

test.cpp: In function ‘int main()’:
test.cpp:12:13: error: missing template arguments before ‘v’
         val v;      //should now be equal to val<float> v;
             ^
test.cpp:12:13: error: expected ‘;’ before ‘v’
Run Code Online (Sandbox Code Playgroud)

默认模板参数不能与'using'一起使用吗?如果是这样,为什么不在行上说明默认参数?

templates using c++11

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

派生类比基类大,即使它由引用变量组成

从我到目前为止所读到的,似乎参考变量根本不应该占用任何内存.相反,它们被视为它们引用的完全相同的变量,但具有另一个名称.

但是,当我运行以下代码时,似乎并非总是如此:

#include <cstdio>
struct A
{
    int m[3];
};
struct B: A
{
    B():x(m[0]), y(m[1]), z(m[2]){}
    int& x;
    int& y;
    int& z;
};
int main(){
    printf("%u, %u\n", sizeof(A), sizeof(B));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

12, 40
Run Code Online (Sandbox Code Playgroud)

为什么B比A大得多?

有没有其他方法可以访问,例如Bm [0]与Bx?

c++

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