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