是否有人知道,例如,我是否用c ++编写以下代码:
int a;
void *ptr = &a;
ptr = (char *)ptr + 1; //<-- this is the interesting line;
(char *)
是否只告诉编译器如何处理这个变量?
或者它实际上是否在运行时添加了更多的计算?
感谢。
答案 0 :(得分:4)
在这里,它纯粹是一个编译时演员。
在一般情况下,C风格的演员可以导致添加一两条指令,例如:如果需要缩小/扩大变量,但它很少见,并不会完全影响性能。
我所知道的唯一的运行时演员是dynamic_cast
。
答案 1 :(得分:3)
在这种情况下,不会进行额外的计算。
但是,在某些情况下,强制转换在技术上是转换,主要是数字输入。例如,以下内容可能会引入运行时代码(前提是它没有进行优化,在一个小例子中你会期望它):
int x = 42;
double d = (double)x;
这里int和double的内部表示意味着你不能只改变编译器看到变量的方式,你也必须改变数据。
答案 2 :(得分:2)
对于您的具体示例,它只是绕过编译器。你基本上说“我知道这不是char*
,但我知道我在做什么,相信我。”
Hoewver ,如果你有一个用户定义的类型,你可以重载强制转换操作符,它将执行你告诉它的操作:
struct A
{
char* x;
A() : x("abc") {}
operator char() { return x[0]; }
operator char*() { return x; }
};
int main()
{
A a;
char x = (char)a; // x == 'a'
char* y = (char*)a; // y == "abc"
return 0;
}
答案 3 :(得分:1)
这取决于演员,我发现对C有点不满意。我宁愿有一种单独的机制将一种类型转换为另一种类型并将一块内存视为特定类型。
但是,对于指针,它始终只是编译时的事情。 char*
具有与void*
完全相同的表示形式(它们只是一个内存地址),因此无需转换它们。