gpt4 book ai didi

c++ - Visual Studio 中指向类数据成员的 C++ 指针的地址

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:30:02 26 4
gpt4 key购买 nike

我正在看书Inside the C++ Object Model .书中有这样的例子:

struct Base1
{
int v1;
};

struct Base2
{
int v2;
};

class Derived : public Base1, public Base2 {};

printf("&Derived::v1 = %p\n", &Derived::v1); // Print 0 in VS2008/VS2012
printf("&Derived::v2 = %p\n", &Derived::v2); // Print 0 in VS2008/VS2012

在前面的代码中,地址 Derived::v1 和 Derived::v2 的打印都将是 0。但是,如果通过变量打印相同的地址:

int Derived::*p;
p = &Derived::v1;
printf("p = %p (&Derived::v1)\n", p); // Print 0 in VS2008/VS2012 as before
p = &Derived::v2;
printf("p = %p (&Derived::v2)\n", p); // Print 4 in VS2008/VS2012

通过检查 &Derived::v1 和 p 的大小,我得到两者都是 4。

// Both are 4
printf("Size of (&Derived::v1) is %d\n", sizeof(&Derived::v1));
printf("Size of p is %d\n", sizeof(p));

Derived::v1 的地址将为0,但Derived::v2 的地址将为4。我不明白为什么 &Derived::v2 在分配给变量时变成了 4

查看汇编代码,直接查询Derived::v2地址时,被翻译成0;但是当它分配给一个变量时,它会被翻译成 4

我在VS2008和VS2012上都测试过,结果是一样的。所以我认为一定有一些理由让微软选择这样的设计。

而且,如果您这样做:

d1.*(&Derived::v2) = 1;

显然 &Derived::v2 不是 0。为什么编译器会区分这两种情况?

谁能告诉我后面发生了什么?谢谢!

--编辑--

对于那些认为 &Derived::v1 没有得到有效地址的人。你没做过吗?

Derived d1, d2;
d1.*p = 1;
d2.*p = 1;

最佳答案

楼主问我这个问题,一开始我也怀疑是类似的错误原因。这不是 VC++ 特有的。

事实证明,&Derived::v2 的类型不是int Derived::*,而是int Base2::*,它的偏移量自然为零,因为它是相对于 Base2 的偏移量。当您将其显式转换为 int Derived::* 时,偏移量会得到纠正。

在 VC++ 或 GCC 或 Clang 上尝试此代码...我坚持使用海报使用的 stdio/printf。

struct Base1 { int a; };
struct Base2 { int b; };
struct Derived : Base1, Base2 { };

#include <cassert>
#include <cstdio>
#include <typeinfo>
using namespace std;

int main () {

printf( "%s\n", typeid(&Derived::a).name() ); // mentions Base1
printf( "%s\n", typeid(&Derived::b).name() ); // mentions Base2

int Derived::* pdi = &Derived::b; // OK
int Base2::* p2i = &Derived::b; // OK
//int Base1::* p1i = &Derived::b; // ERROR

assert( sizeof(int*) == sizeof(pdi) );
printf( "%p %p", p2i, pdi ); // prints "(nil) 0x4" using GCC 4.8 at liveworkspace.org

}

关于c++ - Visual Studio 中指向类数据成员的 C++ 指针的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15519855/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com