Home

关于结构体字节对齐的一些问题

# 字节对齐的目的 字节对齐的作用不仅是便于cpu快速访问,同时合理的利用字节对齐可以有效地节省存储空间。对于32位机来说,4字节对齐能够使cpu访问速度提高,比如说一个long类型的变量,如果跨越了4字节边界存储,那么cpu要读取两次,这样效率就低了。但是在32位机中使用1字节或者2字节对齐,反而会使变量访问速度降低。所以这要考虑处理器类型,另外还得考虑编译器的类型。在vc中默认是4字节对齐的,GNU gcc 也是默认4字节对齐。 字节对齐的基本原则 如下三条 结构体变量的首地址能够被其最宽基本类型成员的大小所整除; 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal...

Read more

Vim轻量级缓冲区管理插件Buf_it修订版Buf_itv2

# 之前发布了Vim的缓冲区管理插件Buf_it的一个修正版,但是后来发现在windows下命令行使用的时候有问题,同时与Nertree和Taglist等插件也有冲突。于是继续fix了几个bug,然后解决了这部分冲突,新的代码放在我的[github][1]上,或者也可以这里下载,有问题可以继续留言,谢谢。 效果如下: ![效果图][2] 安装: 扔进plugin目录就行 配置 nnoremap wq :w:call BufClose(0) nnoremap q :call BufClose(0) nnoremap w :w nnoremap x :call BufClose(1) 使用 shift h,l :左右切换tab \be :BufEch...

Read more

关于Const指针的一点补充

# OsChina上一个朋友给出的例子,很能说明问题: typedef char * CharPtr; const CharPtr mycharptr = "Hello, World"; mycharptr[0]='h'; //OK[1] mycharptr = "It's Wrong"; //Err[2] 如果把CharPtr替代掉的话,那么似乎[1]是错的,[2]是对的,因为const char _是指向const char的指针,指针可以指向别的,但是指向的内容不能变。实际上,const只是编译器的一种规范,所以编译的时候只按照语法检查是不是改变了,char_被typedef之后,可以当成一种简单类型看,那么const CharPtr 就只一个CharPtr型的常量,对它...

Read more

深入解析C++输入输出运算符重载

其实算不上什么深入解析,只不过最近看CArchive类的实现,其中一些写法完全颠覆了我对输入输出运算符重载的一些理解,所以在这里mark一下。 我们以输出运算符为例。首先输出运算符重载的一般形式是 :::cpp friend ostream& operator<<(ostream& o,const ClassName& c);[1]

Read more

简短总结一下C#里跨线程更新UI

跨线程更新UI是写多线程程序尤其是通信类的程序经常遇到的问题,这里面主要的问题是冲突,比如数据线程想要更新UI的时候,用户同时也在更新UI,就会出现争用。C#里可以用 Control.CheckForIllegalCrossThreadCalls = false; 来关闭跨线程检测。但是这样做有一定的风险,容易让程序崩溃。 最好的办法是通过Invoke,这篇博客只是提供一个示例,至于那些线程同步、Invoke和BeginInvoke,Invoke底层实现神马的,有空再说吧。 一个简单的例子如下:(注,Form1 加入了一个名为txt的TextBox) using System; using System.Collections.Generic; using System.C...

Read more