c++如何定义不复制数据的强制转换运算符?

标签 c++ casting operators

好吧 - 也许这是一个愚蠢的问题,类型转换运营商已经天生就这样做了..

我有什么:

  • 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/

相关文章:

python - Pycharm 与使用相等运算符执行的 None 比较

c++ - std::array 和运算符 []

c++ - 指针在退出功能时设置为空指针

c++如何使两个 vector 一个带有数据另一个指向并且只读

c++ - 将 STL 字符串和 STL vector 转换为 void*?

c++ - 为什么 fork() 会导致重复输出?

java - Android Java 在 MyCustomAdapter.java 中发布结果转换问题

swift - 在 Swift 中使用协议(protocol)类型转换异常

swift - 需要澄清 Swift 中的类型转换运算符

python - Python 中的 != 和 <> 运算符之间有区别吗?