好吧 - 也许这是一个愚蠢的问题,类型转换运营商已经天生就这样做了..
我有什么:
4x4 矩阵的一些外部类定义
一些自己的 4x4 Matrix 类
两个类内部都简单地存储一个 float[16];
我想在我的 Matrix 类中定义一个转换运算符,这样我就可以做如下事情:
MyMatrix4x4 m;
OtherMatrix4x4(m).someFunctionDefinedInOtherMatrix4x4();
SomeFunctionThatTakesOtherMatrix4x4(OtherMatrix4x4(m));
而且我不希望这个运算符复制任何数据——函数应该简单地对相同的 float[16] 数据进行操作
怎么做?
最佳答案
And I don't want this operator to copy any data - the functions should simply operate on the same float[16] data
I don't want to create any data on the heap. want this to work with values on the stack - and also for convenciance i'd like to have a cast operator
嗯,这不会发生。 C++ 的别名规则几乎禁止这样做。
您可以使用指针转换来“假装这是别的东西”,但您不能使用对象转换来做到这一点。您可以将指向堆栈对象的指针转换为指向您的对象类型的指针:
MyMatrix4x4 m;
OtherMatrix4x4 * o = (OtherMatrix4x4 *) &m;
但是,有两个问题。首先,o
的持续时间与 m
的持续时间一样长。它不是一个对象;它是指向不同对象的指针。其次,这样做(通常)是未定义的行为(部分原因是违反别名:两个不相关的类型重叠)。哦,很有可能它会起作用。但就 C++ 的保证而言,您已经偏离了 map 。
这有点过早优化的味道。您真的认为复制 16 个 float 是一个很大的性能问题吗?如果是,那么为什么不在代码中使用 OtherMatrix4x4
而不是 MyMatrix4x4
?
关于c++如何定义不复制数据的强制转换运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9672263/