在 C++ 中,我可以使用 sizeof(my_class) 确定类对象的大小。
但是,类的静态部分似乎没有等效的运算符。
C++ 中是否有类似sizeof(static my_class) 的东西?
最佳答案
您不会在标准 C++ 中找到合法或可移植的1 方法来执行此操作,但您当然可以使用特定于平台的工具来检查二进制文件以获得全局大小的估计数据。
在 Unix 平台上,您可以使用多种 ELF 格式阅读工具中的一种来转储符号表和大小。例如,像这样的东西:
nm --demangle --print-size a.out | egrep -i ' [bdgsr] '
将转储 .bss 、 .data 、 .rodata 和相关部分2 中所有全局数据的大小(作为输出中的第二个字段)。
--demangle 参数为您提供来自 C++ 错位名称的人类可读名称。管道末尾的 egrep 将符号限制为通常用于静态变量的符号(即,它省略了函数的符号)。给定以下类(class):
class Foo {
static void StaticFunction();
void MemberFunction();
static int some_int_s;
static long some_zero_long;
static char some_char_array[];
static const char *some_const_string;
};
int Foo::some_int_s = 5;
char Foo::some_char_array[42];
const char* Foo::some_const_string = "hello, world?";
void Foo::StaticFunction() {
}
void Foo::MemberFunction() {
static double f = 0.5;
}
...并使用 g++ 编译,上面给出的 nm 命令输出:
0000000000000000 0000000000000004 D Foo::some_int_s
0000000000000000 000000000000002a B Foo::some_char_array
0000000000000008 0000000000000008 D Foo::some_const_string
0000000000000010 0000000000000008 d Foo::MemberFunction()::f
第二列是全局的大小:int 为 4 字节,char[] 为 0x2a (42) 字节,依此类推。请注意,它也包括函数局部静态变量,这可能是您想要的,因为它们像其他任何东西一样占用大小。您可以使用另一个 grep 来限制特定类。
请注意,Foo::some_const_string 的大小为 8,尽管 hello, world? 的值为 14 个字符(包括终止空值)。事实上,您会发现任何 const char * 或任何静态指针在 64 位平台上的大小都是 8,因为这是指针本身的大小。 字符串文字(字符 h,e,l,l,o,... )的实际数据存储在其他地方,并且 nm 不报告此大小。一般来说,确定字符串文字的大小 is complex 可能没有直接的答案(即,几个类可能共享相同的底层文字数据)。如果您真的想将它包含在您的会计中,您可能必须编写类似 readelf 的脚本。
您也可以尝试现有的二进制大小调整实用程序,例如 Bloaty McBloatface ,尽管快速浏览自述文件似乎表明它可能只是提供与上述相同的信息(例如,它似乎无法处理“字符串文字”问题)。
1 例如,a comment 提到了一种在运行时采用“第一个”和“最后一个”静态变量的差异来估计大小的方法,但除了未定义的行为 它不太可能在实践中工作,因为全局变量分布在二进制文件的各个部分,例如 .bss 、 .data 、 .rodata 和它们的其他变体,因此对于许多人来说,简单的减法几乎肯定会返回错误的结果类。
2 特别是,当我说“相关”时,我的意思是除了默认部分之外,它还会转储“小”已初始化和未初始化部分的大小。
关于c++ - 确定类静态变量的总大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45697799/
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击
我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
我正在编写一个方法,它将在一个类中定义一个实例方法;类似于attr_accessor:classFoocustom_method(:foo)end我通过将custom_method函数添加到Module模块并使用define_method定义方法来实现它,效果很好。但我无法弄清楚如何考虑类(class)的可见性属性。例如,在下面的类中classFoocustom_method(:foo)privatecustom_method(:bar)end第一个生成的方法(foo)必须是公共(public)的,第二个(bar)必须是私有(private)的。我怎么做?或者,如何找到调用我的cust
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:
我收到格式为的回复#我需要将其转换为哈希值(针对活跃商家)。目前我正在遍历变量并执行此操作:response.instance_variables.eachdo|r|my_hash.merge!(r.to_s.delete("@").intern=>response.instance_eval(r.to_s.delete("@")))end这有效,它将生成{:first="charlie",:last=>"kelly"},但它似乎有点hacky和不稳定。有更好的方法吗?编辑:我刚刚意识到我可以使用instance_variable_get作为该等式的第二部分,但这仍然是主要问题。
我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是: