w00*_*00d 4 c++ byte integer cuda operator-overloading
我知道这很荒谬,但我需要它来进行存储优化.有没有什么好的方法在C++中实现它?
它必须足够灵活,以便我可以将它用作普通数据类型,例如Vector< int20 >运算符重载等.
如果存储是您主要关注的问题,我怀疑您需要相当多的20位变量.把它们成对存放怎么样?您可以创建一个表示两个这样的变量的类,并将它们存储在2.5 + 2.5 = 5个字节中.
要方便地访问变量,您可以覆盖[] -operator,这样您就可以编写:
int fst = pair[0];
int snd = pair[1];
Run Code Online (Sandbox Code Playgroud)
因为您可能希望允许诸如此类的操作
pair[1] += 5;
Run Code Online (Sandbox Code Playgroud)
您不希望返回支持字节的副本,而是返回引用.但是,你不能返回对后备字节的直接引用(因为它会弄乱它的相邻值),所以你实际上需要为后备字节返回一个代理(后者又有一个对后备字节的引用)并让代理重载相关的运算符.
事实上,正如@Tony建议的那样,你可以将其概括为一个容纳N个20位变量的通用容器.
(我自己在向量的专门化中完成了这项工作,以便有效地存储布尔值(作为单个位).)
不......你不能把它当作单一的价值语义类型......任何类数据都必须是8位字符大小的倍数(邀请关于CHAR_BITS等的所有常见的讽刺).
那就是说,让我们抓住稻草......
不幸的是,你显然处理了很多数据项.如果这超过64k,任何代理对象进入打包值的自定义容器也可能需要> 16位索引/句柄,但仍然是我能看到的少数几个值得进一步考虑的可能性之一.如果您只是在一个时间点为一小部分值积极处理并需要值语义行为,那么它可能是合适的.
struct Proxy
{
Int20_Container& container_; // might not need if a singleton
Int20_Container::size_type index_;
...
};
Run Code Online (Sandbox Code Playgroud)
因此,代理可能是32位,64位或更多位 - 只有当您可以从索引到容器中动态创建它们,让它们直接写回容器,并使它们短暂存在且同时存在少量时,潜在的好处.(实现此模型的一种简单方法 - 不一定是最快的 - 是使用STL位集或向量作为Int20_Container,并在index_中存储20倍的逻辑索引,或者在运行中相乘.)
尽管你的值超过了20位的空间,但实际使用中你还不到64k个不同的值,这也是模糊的可能.如果您对数据集有一些了解,可以创建一个查找表,其中16位数组索引映射到20位值.