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