代码之家  ›  专栏  ›  技术社区  ›  thecoshman

奇怪的效果

  •  -1
  • thecoshman  · 技术社区  · 14 年前

    以下代码按预期工作:

    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 回复  |  直到 14 年前
        1
  •  2
  •   Johannes Schaub - litb    14 年前

    当然sizeof(T)和sizeof(data)应该是一样的,对吧?或者我误解了什么尺寸的?

    不一定是这样。想想这个:

    template<typename T> void f(T data);
    int main() { f<char[1]>(0); }
    

    这会屈服的 sizeof(char[1]) T ,和 sizeof(char*) 当应用于 data

        2
  •  2
  •   BЈовић    14 年前

    在c++中使用memcpy是一个非常糟糕的主意。

    你知道如果你把一个类的对象存储在一个有虚拟方法的类中会发生什么吗?如果你使用像vector和string这样的memcpy类会发生什么?如果你是幸运的核心垃圾。

    顺便问一下你是怎么使用这个功能的?出什么事了?等

        3
  •  2
  •   Lou Franco    14 年前

    如果sizeof(T)==sizeof(data),您可以签入调试器,它通常应该是这样的。不完全确定如果 T sizeof(U&) 不会和 sizeof() 传递了U&类型的参数。

        4
  •  1
  •   David Thornley    14 年前

    那个 memcpy() 不会给你买任何东西。使用数组或向量。

    你在推进 destination sizeof(data) . 如果使用数组,则从一个条目到下一个条目的距离为 尺寸(数据) . 没有区别。

    data ,那么就没有浪费的空间了。如果末尾有填充,则它是数据结构的一部分,并将包含在 sizeof() . 如果要节省内存,请查看编译器选项以将信息打包到类中。

    float 在您的编辑中,这样做不会浪费内存。

    你没有提供任何关于你如何测试的例子,或者你得到了什么结果,即使在你的编辑中,所以没有人能够帮助你。