Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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++编写以下代码: 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

在这里,它纯粹是一个编译时强制转换

在一般情况下,C样式转换可能会导致添加一条或两条指令,例如,如果需要缩小/扩大变量,但这种情况很少见,并且不会影响性能


我所知道的唯一运行时强制转换是
动态强制转换

对于您的特定示例,它只是为了绕过编译器。你基本上是在说“我知道这不是一个
字符*
,但我知道我在做什么,相信我”

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;