- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我见过/使用过的许多库都有 typedef 来提供可移植的、固定大小的变量,例如 int8、uint8、int16、uint16 等,无论平台如何,它们都是正确的大小(c++11 自己用 header 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 等),并让那些和较小的类(基于基本类型)使用相同的接口(interface)。
最后,每个包装器都可以有一个自身的静态实例,称为 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) 是否有任何额外的内存开销?我理解(?)具有继承的类具有某种虚拟表指针,因此使用的内存略多(或者仅用于虚拟函数?),但假设这些包装类不是从/不是子类继承的,则不存在'使用类而不是基本类型没有任何额外的内存使用,是吗?
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?
如果没有虚函数则不会。如果一个类声明或继承了任何虚函数,则该类称为多态。如果类不是多态的,则对象不需要包含指向虚函数表的指针。此外,不允许将对非多态类的指针/引用沿继承层次向下执行动态转换为对派生类的指针/引用,因此对象不需要具有某种类型信息。
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 .请注意,对于 float/double/long double,您需要一个略有不同的版本。
关于围绕基本类型的 C++ 类包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17793298/
我正在尝试编写一个相当多态的库。我遇到了一种更容易表现出来却很难说出来的情况。它看起来有点像这样: {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE
谁能解释一下这个表达式是如何工作的? type = type || 'any'; 这是否意味着如果类型未定义则使用“任意”? 最佳答案 如果 type 为“falsy”(即 false,或 undef
我有一个界面,在IAnimal.fs中, namespace Kingdom type IAnimal = abstract member Eat : Food -> unit 以及另一个成功
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: What is the difference between (type)value and type(va
在 C# 中,default(Nullable) 之间有区别吗? (或 default(long?) )和 default(long) ? Long只是一个例子,它可以是任何其他struct类型。 最
假设我有一个案例类: case class Foo(num: Int, str: String, bool: Boolean) 现在我还有一个简单的包装器: sealed trait Wrapper[
这个问题在这里已经有了答案: Create C# delegate type with ref parameter at runtime (1 个回答) 关闭 2 年前。 为了即时创建委托(dele
我正在尝试获取图像的 dct。一开始我遇到了错误 The function/feature is not implemented (Odd-size DCT's are not implemented
我正在尝试使用 AFNetworking 的 AFPropertyListRequestOperation,但是当我尝试下载它时,出现错误 预期的内容类型{( “应用程序/x-plist” )}, 得
我在下面收到错误。我知道这段代码的意思,但我不知道界面应该是什么样子: Element implicitly has an 'any' type because index expression is
我尝试将 SignalType 从 ReactiveCocoa 扩展为自定义 ErrorType,代码如下所示 enum MyError: ErrorType { // .. cases }
我无法在任何其他问题中找到答案。假设我有一个抽象父类(super class) Abstract0,它有两个子类 Concrete1 和 Concrete1。我希望能够在 Abstract0 中定义类
我想知道为什么这个索引没有用在 RANGE 类型中,而是用在 INDEX 中: 索引: CREATE INDEX myindex ON orders(order_date); 查询: EXPLAIN
我正在使用 RxJava,现在我尝试通过提供 lambda 来订阅可观察对象: observableProvider.stringForKey(CURRENT_DELETED_ID) .sub
我已经尝试了几乎所有解决问题的方法,其中包括。为 提供类型使用app.use(express.static('public'))还有更多,但我似乎无法为此找到解决方案。 index.js : imp
以下哪个 CSS 选择器更快? input[type="submit"] { /* styles */ } 或 [type="submit"] { /* styles */ } 只是好
我不知道这个设置有什么问题,我在 IDEA 中获得了所有注释(@Controller、@Repository、@Service),它在行号左侧显示 bean,然后转到该 bean。 这是错误: 14-
我听从了建议 registering java function as a callback in C function并且可以使用“简单”类型(例如整数和字符串)进行回调,例如: jstring j
有一些 java 类,加载到 Oracle 数据库(版本 11g)和 pl/sql 函数包装器: create or replace function getDataFromJava( in_uLis
我已经从 David Walsh 的 css 动画回调中获取代码并将其修改为 TypeScript。但是,我收到一个错误,我不知道为什么: interface IBrowserPrefix { [
我是一名优秀的程序员,十分优秀!