我见过/使用的许多库都有 typedef 来提供可移植的、固定大小的变量,例如 int8、uint8、int16、uint16 等,无论平台如何,它们都是正确的大小(并且 c++11 本身使用头文件 stdint.txt 来实现)。 H)
最近在我正在编写的一个小库中使用二进制文件 i/o 之后,我可以看到以这种方式使用 typedef 来确保代码可移植的好处。
但是,如果我要麻烦地键入“namespace::uint32”而不是使用内置的基本类型,那么我也可以使替换尽可能有用。因此我正在考虑使用类而不是简单的 typedef。
这些包装类将实现所有普通运算符,因此可以与基本类型互换使用。
Eg:
int x = 0;
//do stuff
可能成为
class intWrapper {
//whatever
};
intWrapper = 0;
//do stuff
无需修改“//do stuff”中的任何代码
我考虑这种方法而不只是 typedef 的原因是我已经有了对基本类型进行操作的函数,例如
std::string numberToString(double toConvert);
std::string numberToHexString(double toConvert);
int intToXSignificantPlaces(const int& number,
unsigned char numberOfSignificantPlaces);
bool numbersAreApproximatelyEqual(float tollerance);
//etc....
从语法上讲,执行以下操作会更好(而且更多):
intWrapper.toString();
intWrapper.toHexString();
//etc
它还允许我实现 bigint 类(int128 等),并让这些类和较小的类(基于基本类型)使用相同的接口。
最后,每个包装器都可以有一个名为 max 和 min 的静态实例,因此 int32::max 和 int32::min 的良好语法是可能的。
但是,在执行此操作之前,我想解决一些问题(因为它主要是语法糖,并且这些类型的使用非常普遍,任何额外的开销都可能会对性能产生重大影响)。
1)当使用 someClass.operator+()、someClass.operator-() 等而不是 int a + int b 时,是否有任何额外的函数调用开销?如果是这样,内联运算符+()会消除所有这些开销吗?
2)所有外部函数都需要原始类型,例如glVertex3f(float,float,float)不能简单地传递3个floatWrapper对象,有没有办法自动让编译器将floatWrapper转换为float?如果是这样,对性能有影响吗?
3)是否有额外的内存开销?我理解(?)具有继承的类具有某种虚拟表指针,因此使用稍微多一点的内存(或者只是用于虚拟函数?),但假设这些包装类不是从子类继承的/不是子类,则没有“使用类而不是基本类型会增加任何额外的内存使用吗?
4) 这是否会导致任何其他问题/性能影响?