为什么C#里bool要用4bytes来存储,java中不是1bit就搞定了么?? 还是我理解错了? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 java中是1bit?不可能的吧bool内部作为int类型处理,很正常呀,浪费那么几个位对性能只有正面影响,没有负面影响 http://topic.csdn.net/u/20071128/11/19AF0938-3700-4BB9-A84D-95A2908F8BBB.html确实是一个比特阿,为什么底层要四字节对齐,不是浪费么?我觉得是不是C#里value types也都是object,可以调用方法,所以占的大?java里的primary type不能调用方法,只是0/1来表示,所以小 我现在只知道C#里一切比4 bytes小的数据都是转换成4bytes 处理的。但是存储还不清楚。 sbyte就1byte,也要转成4bytes? sizeof(bool) // 输出 1 bool b = true; Console.WriteLine(sizeof(bool)); unsafe { bool* p = &b; //p = 0x0431e510, 打开内存监视窗口, 定位到此处 { *++p = true; // 在内存监视窗口中可以看到 0x0431e511 变成 01 了 //(如果bool占4字节, 应该是 0x0431e514 吧) } }结论, bool 就是占1字节的 那书上写错了?不能把,70-536上写的4bytes Although a boolean value requires only 1 bit (0 or 1), it occupies 1 byte of storage, since this is the minimum chunk with which addressing on most processor architectures can work. Each element in a boolean array uses two bytes of memory. 呵呵,如果是个连续bool变量在内存中是1b .比如 bool[] b=new bool[32]; 应该是1b * 32= 4B 但是 bool b=new bool; 应该也是1b ,但是32位电脑开内存应该是不够4B (32位)的也要 4B .-------------------以上为个人理解,无事实根据------------ 把书上的原文贴下,是不是1byte要看上下文环境 70-536 1st ed那简直就是错误大全啊……当时看书时,勘误表打印了将近20页。第二版虽然改了不少,但竟然还有一部分错误存在。唉。 虽然没搞过java,但LZ所说java用1bit(一个二进制位)表示bool偶认为不太可能.简单是绝不可能.其理由: 1.如果用bit位, 那么势必多个bool会挤在一个字节里面(如果不是,那用bit有何意义呢) 2.造成寻址困难, 会造成很多位操作 3.通用性极差, 试想如果是一个bool的数组,天哪,编译器都不知道怎样处理. 4.如何将很多个离散的bool变量为了节约空间挤在一个或多个字节里,也是编译器的一个沉重的负担. 用1byte表示倒是有可能. 这个要看什么地方的字段、数组、参数是1byte的但是在evaluation stack里面是4byte的如果lz要每个bool占用1bit的话,可以考虑用BitArray(最终使用int[]保存数据,每32个bool使用1个int)或者BitVector32(最终使用一个int保存数据,所以最多放32个bool值) 为什么QQ的文本框能放表情, 而我们的不行?? 程序集 引用 问题 C#字符串的替换 如何定义IDAL静态接口 基于Codesoft模板的二次开发问题 各位工作过的进来看看 如何能让ListBox根据Items里面最长的字符串来自动设置宽度? VS2010窗体设计器改变了但是调试后没有改变。 请问如何在程序中改变经过控件时的光标状态? 有没有c#版本的数据结构书?请赐教 如何直接能访问经过登录身份验证的网页? ◆请教IBatis分页◆
sbyte就1byte,也要转成4bytes?
Console.WriteLine(sizeof(bool));
unsafe
{
bool* p = &b; //p = 0x0431e510, 打开内存监视窗口, 定位到此处
{
*++p = true; // 在内存监视窗口中可以看到 0x0431e511 变成 01 了
//(如果bool占4字节, 应该是 0x0431e514 吧)
}
}结论, bool 就是占1字节的
2.造成寻址困难, 会造成很多位操作
3.通用性极差, 试想如果是一个bool的数组,天哪,编译器都不知道怎样处理.
4.如何将很多个离散的bool变量为了节约空间挤在一个或多个字节里,也是编译器的一个沉重的负担. 用1byte表示倒是有可能.
字段、数组、参数是1byte的
但是在evaluation stack里面是4byte的如果lz要每个bool占用1bit的话,可以考虑用BitArray(最终使用int[]保存数据,每32个bool使用1个int)或者BitVector32(最终使用一个int保存数据,所以最多放32个bool值)