从 Ruby 中确定 sizeof(double) 和 sizeof(int) 的最简单方法是啥?

Posted

技术标签:

【中文标题】从 Ruby 中确定 sizeof(double) 和 sizeof(int) 的最简单方法是啥?【英文标题】:Easiest way to determine sizeof( double ) and sizeof( int ) from Ruby?从 Ruby 中确定 sizeof(double) 和 sizeof(int) 的最简单方法是什么? 【发布时间】:2011-02-21 14:39:45 【问题描述】:

为了使用 Ruby 的 String.unpack 解压缩具有混合双精度和整数的复杂二进制字符串,我需要确定二进制字符串中的偏移量。通常,双精度数是 8 个字节,整数是 4 个字节,但为了使我的代码与机器无关,我想从我的 Ruby 代码中查询这些大小。

在 Ruby 中确定整数和双精度数大小的最简单方法是什么,即请求对 C 的 sizeof( type ) 方法的请求响应?

【问题讨论】:

数据从何而来? Ruby 脚本是否必须在产生值的架构上运行? 你确定这是你想要做的吗?正如@Cristoph 所指出的,大小取决于生成二进制字符串的程序和平台,而不是使用它们的ruby 程序和平台。任何二进制接口规范都应在某处明确指定布局(项目大小、字节序、填充等) 是的,问题是假设二进制字符串是在与接收 Ruby 脚本相同的机器上生成的。 【参考方案1】:

我找到了一个可行的解决方案,通过使用Array#packString#unpack 的逆方法。通过打包 1 个整数或 1 个双精度的字符串,可以从 ruby​​ 本身确定整数和双精度的大小,这与使用 sizeof(int)sizeof(double) 的结果相同(因为在 C 中实现了 Array#pack ):

[1.to_i].pack("i").size # 4
[1.to_f].pack("d").size # 8

【讨论】:

【参考方案2】:

这太明显了,我可能错过了重点:

puts 1.size #=> 4
puts (256**10 - 1).size   #=> 12

【讨论】:

嘿? int 的大小(确保使用puts 1.to_i.size)在我的机器上生成 8(MBP,ruby 1.8,7),而不是 4,即 C 中的 sizeof( int ) 我猜你有一个 64 位处理器,我的是 32 位的。我不知道 C 是如何处理这个问题的。【参考方案3】:

我不熟悉 Ruby 语言或其构建/分发系统。但是,Rake 的存在表明可以在包安装时创建自定义文件 - 例如将以下命令的结果导出为 Ruby 常量的配置文件:

echo __SIZEOF_INT__ | gcc -E -P -
echo __SIZEOF_DOUBLE__ | gcc -E -P -

【讨论】:

除了文字/原始 __SIZEOF_INT____SIZEOF_DOUBLE__ 字符串(在 mac 上使用 gcc 4.2.1 或在 linux 机器上使用 gcc 4.1.2,我无法让它输出任何其他内容,有或没有-c)。 根据我的google-fu,补丁日期为2007年;不知道它何时首次包含在版本中,但我可以确认它在 4.3.4 中...【参考方案4】:

我目前的解决方案是有一个小的 C 程序,sizeofdouble.c:

#include <stdio.h>
int main() 
    printf( "%lu", sizeof(double) );

当编译为sizeofdouble 可执行文件时,可以使用

从 ruby​​ 调用
sizeofdouble = `./sizeofdouble`.to_i

但这是一个丑陋的 hack,而不是这个问题的干净解决方案。

【讨论】:

您的 C 程序不可移植,因为 sizeof (long) == sizeof (size_t) 不一定正确;要么使用 z 长度修饰符(不被普遍支持)或强制转换为 unsigned(不需要 unsigned long【参考方案5】:

我知道我在这里聚会迟到了,但是 ruby​​ 的 Fiddle 库将您可能想要的所有数据类型的大小公开为常量。以下是在我的系统(64 位 MacOS 10.13)上的结果:

require 'fiddle'

Fiddle::SIZEOF_SHORT   # => 2
Fiddle::SIZEOF_INT     # => 4
Fiddle::SIZEOF_DOUBLE  # => 8
Fiddle::SIZEOF_SIZE_T  # => 8
Fiddle::SIZEOF_SSIZE_T # => 8

见:https://ruby-doc.org/stdlib-2.5.0/libdoc/fiddle/rdoc/Fiddle.html#SIZEOF_CHAR

【讨论】:

以上是关于从 Ruby 中确定 sizeof(double) 和 sizeof(int) 的最简单方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

malloc分配内存为多大?

c学习-9

数据对齐

Double-splat 运算符破坏性地修改了哈希——这是一个 Ruby 错误吗?

C 语言实例 - 计算 int, float, double 和 char 字节大小。

关于 sizeof 溢出 size_t 的 C 标准