安全地将临时结构的模板联合体穿过ABI

时间:2016-01-06 05:25:58

标签: c++ struct unions abi dynamic-loading

我为具有多个属性名称的2D矢量定义了以下联合模板:

template<T> union vec2
{
    struct {
        T x;
        T y;
    };
    struct {
        T u;
        T v;
    };
    struct {
        T i;
        T j;
    };
    struct {
        T width;
        T height;
    };
    template<ST> vec2(vec2<ST> other) : x(other.x), y(other.y);
    vec2() : x(0), y(0);
    vec2(T v1, T v2) : x(v1), y(v2);
}

虽然我认为在ABI之间传递并导致错误是安全的,因为:

所有成员都是相同的类型,因此struts将被打包而不需要任何额外的填充。

构造函数是内联的,只需设置第一个结构的属性。

所以联盟应算作POD

预期用途,

模板位于包含主应用程序和外部库(可能使用不同编译器编译)的标头中

说我从外部库中有以下类型的函数指针

typedef void* (__fastcall *createWindow)(vec2<uint16_t>, char* title);

我的理解是打电话

void* window = createWindow(vec2<uint16_t>(320,240), "Test Window");

将是完全安全的,因为vec2只是两个16位整数打包成一个包含值(320,240)的32位整数,并且随着库被编译为同一平台即32位窗口,它们将存储此数据完全相同(因为结构不应该有填充),因此我动态加载createWindow的库可以使用任何属性对访问值,即width = 320,height = 240。

我的推理是否正确,如果没有办法让这个安全地工作,请注意我需要模板,以便从vec2转换为vec2。

0 个答案:

没有答案