【问题标题】:Can sizeof() ever return a different value for the same type?sizeof() 可以为同一类型返回不同的值吗?
【发布时间】:2015-11-12 17:58:33
【问题描述】:

在 C 语言中,在 VxWorks 操作系统上,我在 sizeof 上遇到相同输入参数的不同返回值。

我只有一个特定结构的声明:

typedef struct Data{
    //contains ints, floats, int[], and float[]
} Data;

有两个独立的衍生任务,每个任务调用:

sizeof(Data);

两次调用的大小不同。
返回的值之一小于应有的值。

这可能是什么原因造成的?
为什么sizeof 在同一个类型声明中返回不同的字节数?

【问题讨论】:

  • 在同一台机器上使用相同的编译器?没有。
  • 或者有人在头文件顶部添加了#pragma pack(1),忘记添加#pragma pack(pop)
  • @AlecTeal 在同一台机器上使用相同的编译器?不。 是的,同一个编译器可以为一个对象生成不同的大小。不同的命令行参数和/或优化级别会影响对齐,从而影响大小。请参见 Intel 的 -align 选项 (software.intel.com/en-us/articles/…) 和 Oracle 的 -xmemalign-fast-dalign 选项 (docs.oracle.com/cd/E24457_01/html/E22003/cplusplus.1.html) 使用不同的命令行参数编译不同的编译单元可能会导致对象的大小不同。
  • (cont) 例如,如果库代码是使用一组特定的对齐修改命令行参数编译的,但调用可执行文件是使用一组不同的命令行参数编译的,则可执行文件和库可以不同地解释结构的内容。 (这是使库 API 不透明的一个很好的理由。)

标签: c struct byte sizeof vxworks


【解决方案1】:

尽管结构只有一个声明,但结构内的数组的大小由宏指定。宏在另一个文件中重新定义。

【讨论】:

    【解决方案2】:

    没有。

    名称修饰是一个单射(1 对 1)函数,给定名称和某些类型,实现总是将其映射到同一事物。

    sizeof 也是如此 - size-of 也是我们访问编译器对结构的“结构空间量”知识的一种简单方式,所以如果它可以改变这真的非常非常糟糕。

    你的库是用同样的东西编译的吗?你确定数据是一样的吗?这些是可以改变的 - 看看那里。

    旁注:

    大小几乎是固定的,但事情是一致的,比如我们有一个 int 和一个 void* - 这是 12 个字节的数据,但它可能对齐到 16 个字节,所以 void* 是一个倍数8 字节对齐,这在某些系统上提供了很大的性能增益。 GCC 和 LLVM 都走同样的路,LLVM 将兼容性作为优先事项,GCC 也将与旧版本的 GCC 的兼容性作为重中之重。所以没有sizeof 不会改变。

    【讨论】:

    • 多年后,但运气不好,我从我的用户页面点击了这个链接。这是一个矛盾的证明——假设我们可以,那么名称修改要么包括这个,要么是无用的,并且链接也需要注意——他们不是,因为它会非常困难并导致链接问题。然后我说包装。请注意, alignof(T) 总是精确地除以 sizeof(T)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多