C ++:获取通用代码中对象大小的最佳方法

时间:2014-07-31 17:34:08

标签: c++ templates

我正在编写一个模板类,它调用一个哈希函数,该函数将一个指向对象和该对象大小的指针作为参数。

例如,如果item的类型为int,则呼叫将为
MurmurHash2(&item, sizeof(item), seed);
但如果itemstd::string,我们就必须这样做 MurmurHash2(item.c_str(), item.size(), seed);

编写此代码的最简洁方法是什么,以便它可以处理尽可能多的类型?

2 个答案:

答案 0 :(得分:5)

你的解决方案存在固有的缺陷,你不能通过指向对象的开头和对象的大小来创建一个哈希函数,并期望它能够工作。考虑一个简单的类型和两个变量:

struct T {
   char ch;
   int  i;
} a = { 'a', 1 }, b = { 'a', 1 };

在我当前的平台上(我想在大多数平台上),sizeof(T) == 8只有5个字节是对象的的一部分,其他3个是填充。填充中的字节值不保证具有任何值,并且它们在ab中可能会有所不同,即使这两个对象具有相同的值。

答案 1 :(得分:0)

一种可能的解决方案:使用Boost.Serialization之类的东西将对象转换为标准化的字节流,然后将其与大小一起传递给MurmurHash函数。