提问者:小点点

C++强制转换具有不同内存布局的两种类型


我正在试图找出一种方法来强制转换两个类型,这两个类型具有相同的字段,但顺序不同(甚至有些字段丢失),而不需要复制。

例如,如果我们有以下结构:

typedef struct Foo {
  int age;
  float height;
  char* name;
} Foo;

typedef struct Bar {
  float height;
  float weight;  
  char* name;
  int age;
} Bar;

有没有什么方法可以将Bar转换成Foo,而不必制作中间副本?

Bar bar;
Foo foo;

bar = foo;

此外,是否有可能通过指针强制转换来实现此操作?

Bar *bar;
Foo foo;

bar = &foo

提前谢谢! 问好,萨尔瓦


共2个答案

匿名用户

不。

那些是不相关的类型。

您可以将数据从第一个对象复制到第二个对象中,或者,在某些有限的情况下,使用一些指针魔术来假装第一个对象具有第二个对象的类型。 这不是其中一个案例。

幸运的是,复制int和float很便宜,而且根据您的情况,可能实际上在运行时不涉及任何活动(编译器很聪明!)。

匿名用户

不是直接那样。 不能使类型的指针指向不相关的类型,这将违反别名规则。

如果两种类型都有一个公共的初始序列,则可以使用union来执行此操作。 但是,您不具备:某些第一个成员的类型不相同。

下面是一个具有公共初始序列的结构示例:

struct Foo {
    char const* name;
    int age;
    float height;
};

struct Bar {
    char const* name;
    int age;
    float height;

    float weight;
};

union Foobar {
    Foo foo;
    Bar bar;
};

auto const foobar = Foobar{Bar{}};

// can access foo even though bar is initialized.
// a whole foo is a common initial sequence of bar.
Foo const* foo = foobar.foo;

您也可以简单地将公共成员放在父类中:

struct common {
    char const* name;
    int age;
    float height;
};

struct Foo : common {
    // whatever
};

struct Bar : common {
    // whatever
};

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++|强制|转换|内存|布局|两种|类型)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?