c镶铸c++;,编译时还是运行时? 是否有人知道,例如,我用C++编写以下代码: int a; void *ptr = &a; ptr = (char *)ptr + 1; //<-- this is the interesting line; inta; void*ptr=&a; ptr=(char*)ptr+1//
在这里,它纯粹是一个编译时强制转换 在一般情况下,C样式转换可能会导致添加一条或两条指令,例如,如果需要缩小/扩大变量,但这种情况很少见,并且不会影响性能c镶铸c++;,编译时还是运行时? 是否有人知道,例如,我用C++编写以下代码: int a; void *ptr = &a; ptr = (char *)ptr + 1; //<-- this is the interesting line; inta; void*ptr=&a; ptr=(char*)ptr+1//,c++,c,casting,C++,C,Casting,在这里,它纯粹是一个编译时强制转换 在一般情况下,C样式转换可能会导致添加一条或两条指令,例如,如果需要缩小/扩大变量,但这种情况很少见,并且不会影响性能 我所知道的唯一运行时强制转换是动态强制转换对于您的特定示例,它只是为了绕过编译器。你基本上是在说“我知道这不是一个字符*,但我知道我在做什么,相信我” Hoewver,如果您有一个用户定义的类型,您可以重载cast操作符,它将执行您告诉它的操作: struct A { char* x; A() : x("abc") {} o
我所知道的唯一运行时强制转换是
动态强制转换
对于您的特定示例,它只是为了绕过编译器。你基本上是在说“我知道这不是一个字符*
,但我知道我在做什么,相信我”
Hoewver,如果您有一个用户定义的类型,您可以重载cast操作符,它将执行您告诉它的操作:
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有点不满意。我宁愿有单独的机制将一种类型转换为另一种类型,并将一块内存当作一种特定类型来处理
然而,对于指针来说,它始终只是编译时的事情。
char*
与void*
具有完全相同的表示形式(它们只是一个内存地址),因此无需对它们进行转换。在这种情况下,不会进行额外的计算
但是,在某些情况下,强制转换在技术上是一种转换,主要是数字输入。例如,以下内容可能会引入运行时代码(前提是未对其进行优化,在这样一个小示例中,您会期望它是这样的):
这里,int和double的内部表示意味着你不能仅仅改变编译器如何查看变量,也必须改变数据。
嗯,这是用C++固定的,用<代码> RealTytCase等等。甚至中间的一段也是额外的信息。(我认为他在写问题时也没有考虑用户定义的强制转换。)int x = 42;
double d = (double)x;