与sizeof的奇怪效果

时间:2010-11-01 19:34:45

标签: c++ templates sizeof

以下代码按预期工作:

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);
}

4 个答案:

答案 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,则无论如何都不会浪费内存。

您没有提供任何关于您如何测试的示例,或者您在编辑中获得的结果,因此没有人能够帮助您。