基于类型的C类包装器
作者:互联网
我见过/使用的许多库都有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”中的任何代码
我正在考虑这种方法而不仅仅是typedef的原因是我已经拥有对基本类型进行操作的函数,例如
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 int中使用someClass.operator(),someClass.operator-()等时是否有任何额外的函数调用开销?如果是这样,内联运算符()会消除所有这些开销吗?
2)所有外部函数都需要基本类型,例如glVertex3f(float,float,float)不能简单地传递3个floatWrapper对象,有没有办法自动使编译器将floatWrapper转换为float?如果是这样,是否会产生性能影响?
3)是否有额外的内存开销?我理解(?)具有继承的类具有某种虚拟表指针,因此使用稍多的内存(或者仅仅用于虚函数?),但假设这些包装类不是从子类继承而不是子类,那么任何额外的内存使用使用类而不是基本类型,是吗?
4)这可能导致其他任何问题/性能影响吗?
解决方法:
1) Is there any additional function calling overhead when using someClass.operator+()
不,如果函数体很小并且在标题中,它将被内联,并且没有开销
2) Is there a way to automatically make the compiler cast the floatWrapper to a float?
struct floatWrapper {
floatWrapper(float); //implicit conversion from float
operator float(); //implicit conversion to float.
};
同样,如果函数的主体很小并且在标题中,它将被内联,并且没有开销
3) Is there any additional memory overhead?
如果没有虚函数则不行.如果一个类声明或继承任何虚函数,则该类称为多态.如果类不是多态的,则对象不需要包含指向虚函数表的指针.此外,不允许执行对继承层次结构中的非多态类的指针/引用的dynamic_cast到指向派生类的指针/引用,因此不需要对象具有某种类型信息.
4) Are there any other problems / performance impacts this could cause?
性能?没有.
此外,确保实现不将lhs修改为自由函数的二元运算符,并重载它们以支持floatWrapper和float的所有相关排列.
struct floatWrapper {
explicit floatWrapper(float);
operator float(); //implicit conversion to float.
floatWrapper operator-=(float);
};
floatWrapper operator-(floatWrapper lhs, floatWrapper rhs)
{return lhs-=rhs;}
floatWrapper operator-(float lhs, floatWrapper rhs)
{return floatWrapper(lhs)-=rhs;}
floatWrapper operator-(floatWrapper lhs, float rhs)
{return lhs-=rhs;}
Here’s my attempt at such a thing.注意你需要一个略微不同的版本浮动/双/长双.
标签:c,portability,wrapper,types,typedef 来源: https://codeday.me/bug/20190927/1822979.html