将整数存储为特定数字类型(uint8、int16、uint32、int64 等)对内存有何影响?我知道每种类型可以采用的整数范围,但是是否可以通过使用适当的类型来提高内存效率?
例如,在 Golang 中,将某人的年龄存储为 uint8 而不是单位(根据其规范 https://golang.org/ref/spec#Numeric_types 等同于 uint32 或 uint64)“似乎”更有效
最佳答案
固定大小的整数需要精确的内存量。对单个变量“到处”使用较小的整数类型,如果有的话,你只会获得很少的内存。此外,当用作结构字段的类型时,由于隐式填充,您可能不会再有任何收获。
当您使用固定大小的整数作为(大) slice 或数组的元素类型时,内存增益可能会很明显且相当可观。
使用固定大小整数的另一个(可能更重要的)原因可能是为了传达您存储在其中的内容。您也可以使用 int32 或 int64 类型来存储字节,但这是一种明显的浪费,它们不会传达有效范围存储在其中的数据。
还有一点就是效率。您始终可以使用 int64 代替其他有符号整数类型,但在某些架构上对 int64 执行操作可能需要多个寄存器操作,因此速度相当慢。此外,rune 类型(int32 的别名)清楚地表明您打算将其用于 unicode 代码点。
另一点是一致性。如果你使用 int32 在一个地方建模,你应该坚持使用并在所有地方使用相同的类型。这在 Go 中比在其他语言中更重要,因为 Go 的类型系统是严格的(比大多数其他语言的更严格),这意味着如果你有一个 int32 类型的值,你不能将它分配给一个int64 类型的变量,反之亦然,无需显式转换。
int 与固定大小的整数类型int 和uint 不是固定大小,而是根据Spec: Numeric types:
uint either 32 or 64 bits int same size as uint
当您使用 int 时,编译器可能会针对不同的体系结构生成更优化的代码。 通常 int 在针对 32 位架构时是 32 位的,在针对 64 位架构时是 64 位的。这意味着 int 的大小将与目标体系结构的寄存器大小相匹配,因此可以通过单个寄存器操作有效地执行整数操作。例如,如果您使用 int64,则可能需要执行多个(寄存器)操作才能在 32 位架构上执行单个整数操作。
我喜欢将 int 视为一种整数类型,用于以它认为合适的最佳方式描述和传达 Go 运行时数据结构的某些部分或组件。例如,索引数组或 slice ,或描述它们的大小,int 是要使用的“自然”类型。
The built-in functions
lenandcaptake arguments of various types and return a result of typeint. The implementation guarantees that the result always fits into anint. For example indexing slices or array, or to describe their length and capacity,intis the "natural" type recommended or enforced.
当使用 for range 语句和数组、 slice 或 string 值上的至少一个迭代变量时,迭代变量(“索引”)将是类型int.
另请注意,Rob Pike 为 Go 2 提出了将 int 更改为任意精度的提案。 proposal: spec: change int to be arbitrary precision
关于go - 使用特定数字类型而不是其他数字类型意味着什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52076575/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于
我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t