class 实例的地址是否等于 class 中唯一元素的地址

Is the address of an class instance equal with the address of the unique element in the class

我正在研究一段用 g++-7.4 编译的 C+ 代码 我的问题是 return 来自 class B 的 class 成员的地址是否安全,并将其分配为 class A 的指针,其中该成员是唯一的. 让我们用下面的例子把它弄清楚

#include "pch.h"
#include <iostream>
class DummyMsg
{
public:
    DummyMsg () = default;
    DummyMsg(const DummyMsg &) = default;
    ~DummyMsg()=default;
};
class ROCallContext
{
public:
    ROCallContext() = default;
    ROCallContext(const ROCallContext &) = default;
    ~ROCallContext() = default;
    DummyMsg *dummyMsg;
};
class RWCallContext
{
public:
    RWCallContext()
    {
        dummyMsg = new DummyMsg();
    }
    ~RWCallContext()
    {
    }
    void* getDummyMsg()
    {
        return reinterpret_cast<void *>(dummyMsg);
    }
    int i;
    double d;
    char * pc;
    DummyMsg *dummyMsg;
    char c_array[100];

};
int main()
{
    RWCallContext * rwCallContext = new RWCallContext();

    ROCallContext * ctx = reinterpret_cast<ROCallContext *>(rwCallContext->getDummyMsg());

}

ROCallContext::dummyMsg是否等于RWCallContext::dummyMsg? ROCallContext::dummyMsg和RWCallContext::dummyMsg的内容一样吗?

是否取决于编译器优化?

这将是一个真正的成功或失败,因为你的问题有点模糊。

传递指针是否安全.. 是的,当然,如果您跟踪它,当代码变大时您可能无法做到这一点。如果您需要传递指针,请改用 shared_ptr。

无论如何,如果您 运行 这段代码,如果指针相等,它有望解释您的第二个问题。希望它对你有意义。

#include <iostream>
class DummyMsg {
    public:
        int i = 0;
};

class ROCallContext {
    public:
        ROCallContext(DummyMsg *msg) {
            dummyMsg = msg;
        }
        DummyMsg *dummyMsg;
};

class RWCallContext {
    public:
        RWCallContext() {
            dummyMsg = new DummyMsg();
        }
        DummyMsg* getDummyMsg() { 
            return dummyMsg;
        }
        DummyMsg *dummyMsg;
};
int main() {
    RWCallContext * rwCallContext = new RWCallContext();
    ROCallContext * ctx = new ROCallContext(rwCallContext->getDummyMsg());
    printf("Address of RW is %p\n", (void *)rwCallContext->dummyMsg);
    printf("Address of RO is %p\n", (void *)ctx->dummyMsg);
    printf("RO i: %i\n", ctx->dummyMsg->i);
    printf("RW i: %i\n", rwCallContext->dummyMsg->i);
    printf("Changing value for RW\n");
    rwCallContext->dummyMsg->i = 2;
    printf("RO i: %i\n", ctx->dummyMsg->i);
    printf("RW i: %i\n", rwCallContext->dummyMsg->i);
    delete rwCallContext->dummyMsg;
    delete rwCallContext;
    delete ctx;
}

编辑:刚刚意识到问题可能是,即使您投射的 class from/into 没有相同的结构,dummyMsg 是否会是相同的值。 如果是这样的话,也许这个例子可以解释为什么它可能不会有相同的值。

#include <stdio.h>

struct A {
    int x;
    int y;
};

struct B {
    int y;
    int x;
};

int main() {
    struct A a = {1, 2};
    struct B *b = (struct B*)&a;
    printf("Struct A x: %i, y: %i\n", a.x, a.y);
    printf("Struct B x: %i, y: %i\n", b->x, b->y);
}

Output:
Struct A x: 1, y: 2
Struct B x: 2, y: 1