有没有重新解释转换指针值的实例? 根据C++标准,一个指针>代码> >代码> >代码>其他代码指针>代码> q*。 我很感兴趣,有没有一个C++实现的例子,其中用一个指针来抛出指针的类型,用 RealTytCase< /Cord>改变指针?更改了什么以及更改的原因?

有没有重新解释转换指针值的实例? 根据C++标准,一个指针>代码> >代码> >代码>其他代码指针>代码> q*。 我很感兴趣,有没有一个C++实现的例子,其中用一个指针来抛出指针的类型,用 RealTytCase< /Cord>改变指针?更改了什么以及更改的原因?,c++,compiler-construction,casting,C++,Compiler Construction,Casting,请注意,当标准声明它可以或不可能执行某些操作时,这并不意味着当前存在任何具有该行为的实现,只是它们可以 我能想到的最接近的是硬件需要类型对齐的体系结构,以及决定在需要时纠正对齐的实现。比如: aligned8 var; aligned1 *p = reinterpret_cast<aligned1*>(&var); aligned1 *q = p + 1; // assuming aligned 1 size is not multiple of 8 aligned8 *a

请注意,当标准声明它可以或不可能执行某些操作时,这并不意味着当前存在任何具有该行为的实现,只是它们可以

我能想到的最接近的是硬件需要类型对齐的体系结构,以及决定在需要时纠正对齐的实现。比如:

aligned8 var;
aligned1 *p = reinterpret_cast<aligned1*>(&var);
aligned1 *q = p + 1; // assuming aligned 1 size is not multiple of 8
aligned8 *a = reinterpret_cast<aligned8*>(q); // [1]
aligned8var;
aligned1*p=重新解释铸件(&var);
对齐1*q=p+1;//假设对齐1的大小不是8的倍数
对齐8*a=重新解释铸造(q);//[1]
可能要求
a
要成为有效指针,它必须寻址8的内存位置倍数,而对齐要求较低的参数
q
可以指向任何内存地址。

class A1{int A1;};
class A1 { int a1; };
class A2 { int a2; };

class B: public A1, public A2 { };

#define DBG(val)  cout << #val << ": " << val << endl

// test code
B b;
DBG(&b);                                           // prints 0x42

void *p_blank = &b;
DBG(p_blank);                                      // prints 0x42
A2 *p_a2 = &b; 
DBG(p_a2);                                         // prints 0x46
void *p_reinterpreted = reinterpret_cast<A2*>(&b);
DBG(p_reinterpreted);                              // prints 0x42
A2 *p_reinterpreted2 = reinterpret_cast<A2*>(&b);
DBG(p_reinterpreted2);                             // prints 0x42
A2类{int A2;}; B类:公共A1、公共A2{};
#define DBG(val)coutReinterpret_cast将永远不会返回不同的地址-需要复制准确的地址

在多重继承的情况下,如David Rodriguez所说,获取其中一个基的地址可能会返回一个与第一个基的地址有偏移量的地址。Reinterpret_cast将返回该偏移地址,但如果将其视为上行地址,则会出现地狱

对于向上广播,静态广播可以返回与给定地址不同的地址。如果您拥有的地址是其中一个基址,并且该地址与第一个基址的偏移量相同,则static_cast将返回上溯对象的有效地址,该地址等于第一个基址的地址,因此不等于传递的指针

简而言之:reinterpret_cast始终为您提供相同的地址。静态_-cast和动态_-cast可能返回不同的地址,例如在涉及多重继承的某些情况下


静态\u cast和动态\u cast之间的区别在于,静态\u cast不会检查您给它的指针是否是该强制转换的正确对象,因此在调用它之前请确保这一点。

最有可能的故障源是在向量机上,其中标量操作是根据向量定义的,标量指针由指向向量的指针和指向向量的索引组成。从历史上看,最初的克雷建筑是这样的,它让人头疼。现在,你可能会在GPU上看到类似的东西,但我无法从头顶上指出具体的东西

最可能的影响是截断,因为目标指针类型缺少指定索引部分的位。C++11允许对任何指针类型进行重新解释,只要它们具有相同的对齐要求,就可以朝这个方向点头。通过严格对齐“归零”的位不允许存在

对象指针可以显式转换为 一种不同的类型。当“指向T1的指针”类型的PRV值为 转换为“指向cv T2的指针”类型,如果T1和T2都是标准布局,则结果为
static_cast(static_cast(v))
类型(3.9)和T2的对准要求不比 T1的类型,或任一类型无效。转换类型为的值 “指向T1的指针”指向类型“指向T2的指针”(其中T1和T2是 对象类型,且T2的对齐要求不适用 比T1)更严格,并恢复到其原始类型,产生 原始指针值。任何其他此类指针的结果 未指定转换


我认为这个问题对于C++与C指针的转换是不一样的。我只引述其中一个例子:

Data General中的Eclipse MV系列有三种体系结构支持的指针格式(字、字节和位指针),其中两种由C编译器使用:用于
char*
void*
的字节指针,以及用于其他一切的字指针


这意味着一个
reinterpret\u cast(char*)
可能会失去单词中哪个字符/字节被指向的意义,从而使操作不可逆。

你的意思是指针指向的“改变值”?@akira:不,改变指针本身的值,你的意思是:
T*T=0x13;Q*Q=0x42;t=重新浇铸(q)产量
t!=0x42
?@akire:我想是的。我自己也不确定,这就是我问的原因。您可能对阅读链接问题的答案感兴趣-他们启发我提出了这个问题。所以您不确定自己在问什么?:)我认为被删除的答案是因为问题有点不清楚。是的,链接的问题很有趣。在您的示例中,
重新解释\u cast
根本不会更改值。。。恐怕你走了。在
A2*p_A2=&b
您使用的隐式转换相当于
静态转换
,而不是
重新解释转换
。似乎我没有正确理解这个问题。我知道您搜索的是reinterpret_cast返回的值与空白“address of”运算符的值不同的情况。我没有在C++标准中找到一个条款,它允许RealTytRCAST与RealTytCaseCasp不同。@阿基拉:当你将一个隐式上行(或)变成一个基指针时,返回的指针是该基类的子类在该对象中的地址。当你用第一个碱基做这件事时,地址是一致的。如果存在多重继承,则向上转换到除第一个基类以外的所有基类(假设第一个基类不是空的)wil