在Game Boy CPU Manual的第87页,声称该CP n指令在没有借位时设置进位标志,这意味着A < n.这似乎与自身发生冲突,因为进位标志设置时A > n.
例如:如果A=0和B=1,则CP B设置标志,如SUB A, B0 - 1.这变为0 + 255 = 255并且未设置进位标志,即使如此A < B.
我在其他Z80文档中也遇到过同样的问题,所以我不相信这是一个错字.
我是否误解了借用和SUB工作的方式或是否有其他事情发生?是SUB不是等于ADD在标志方面补?
很难想出一个标题......(我不是英语母语人士.)
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?
我在计算机上运行了我的基准测试(英特尔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'存在时,为什么函数指针比内联函数更快?
我想为一个类型别名,以便在必要时可以给它一个模板参数.
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'一起使用吗?如果是这样,为什么不在行上说明默认参数?
从我到目前为止所读到的,似乎参考变量根本不应该占用任何内存.相反,它们被视为它们引用的完全相同的变量,但具有另一个名称.
但是,当我运行以下代码时,似乎并非总是如此:
#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?