以下代码按预期工作:
template <typename T>
inline char* Utils::PushData(char* destination, T data)
{
memcpy(destination, &data, sizeof(data));
destination += sizeof(T);
return destination;
}
然而,当我使用它时:
template <typename T>
inline char* Utils::PushData(char* destination, T data)
{
memcpy(destination, &data, sizeof(T));
destination += sizeof(T);
return destination;
}
我正在建造的模型搞砸了。为什么会这样?当然sizeof(T)
和sizeof(data)
应该是一样的,对吗?或者我误解了sizeof
实际得到的大小?
修改
我真的不太喜欢这个,只是觉得这很奇怪。我正在使用memcpy
,因为我需要确保我的数据填充了填充,我也相信我的自己(唯一将使用此代码的人,除非我决定更进一步)知道只使用它有基本类型,我甚至没有直接调用这个函数,我会调用一个函数来获取一个从调用位置更有意义的格式的数据。我会使用类似......
inline char* Utils::PushXYZ(char* destination, float xValue, float yValue, float zValue)
{
destination = PushData<float>(destination, xValue);
destination = PushData<float>(destination, yValue);
return PushData<float>(destination, zValue);
}
答案 0 :(得分:2)
在c ++中使用memcpy是一个非常糟糕的主意。
如果你记住具有虚方法的类的对象,你知道会发生什么吗?如果你像mem和string这样的memcpy会发生什么?如果你幸运的话 - 核心转储。
顺便问一下你是怎么使用这个功能的?什么地方出了错?等等 如果可能的话,发布一个最小的可编译示例
答案 1 :(得分:2)
您可以检查调试器是否sizeof(T)== sizeof(data),它应该是正常的。不是100%确定如果T
是引用类型会发生什么,但我认为sizeof(U&)
与通过U&amp;参数的sizeof()
不一致类型。
答案 2 :(得分:2)
当然sizeof(T)和sizeof(数据)应该是相同的,对吧?或者我误解了实际大小的大小?
情况不一定如此。考虑一下这个:
template<typename T> void f(T data);
int main() { f<char[1]>(0); }
在应用于sizeof(char[1])
时会生成T
,而在应用于sizeof(char*)
时会生成data
。根据您的代码,您可能会对模板进行奇怪的实例化,这可能会导致这种情况。
答案 3 :(得分:1)
那memcpy()
没有给你买任何东西。使用数组或向量。
您按destination
推进sizeof(data)
指针。如果使用数组,则从一个条目到下一个条目的距离为sizeof(data)
。没有区别。
如果data
的末尾没有填充,则没有浪费的空间。如果最后有填充,则它是数据结构的一部分,并将包含在sizeof()
中。如果要保存内存,请查看编译器选项以在类中打包信息。
如果您使用的是标准类型,例如编辑中的float
,则无论如何都不会浪费内存。
您没有提供任何关于您如何测试的示例,或者您在编辑中获得的结果,因此没有人能够帮助您。