C++ memset

memset ?

http://www.cnblogs.com/xiaolongchase/archive/2011/10/22/2221326.html

 

打印日志方法:fprintf(stderr, "0000000000000000\n");

查看core文件是哪个程序产生的,方法:

ls core* |xargs file |grep while

file core.5277

gdb调试core文件的方法:

gdb while_set core.5227

执行bt (backtrace)

 

struct和class的区别:

struct和class本质上是一样的。

区别点在于:权限不同。

struct默认是public

class默认是priviate

 

memset()的深刻内涵:用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为0 或‘\0’;

memset可以方便的清空一个结构类型的变量或数组。

标准C中没有构造的概念,没有函数成员,只有数据成员。
struct sample_struct
{
char csName[16];
int iSeq;
int iType;
};

struct sample_strcut stTest;

struct sample_struct
{
char csName[16];
int iSeq;
int iType;
};

对于变量
struct sample_strcut stTest;

一般情况下,清空stTest的方法:
stTest.csName[0]='\0';  //首位为空,相当于置空
stTest.iSeq=0;
stTest.iType=0;

用memset就非常方便:
memset(&stTest,0,sizeof(struct sample_struct))

 

说明:使用memset具有绝对的好处,memset是初始化一连串的内存区域。而采用成员赋值方式没有memset好,因为C++中有内存对齐的概念。局部变量赋值法是没有办法解决变量对齐所开销的内存。

举例:

Byte a;(无符号char 即byte类型)占用1个字节,

int b;(int类型)占用4个字节。

a到b之间出现了盲区,由操作系统随机赋值。 这个时候用memset保证盲区初始化。

存放规则:逻辑地址取模=0 表示能放下。否则逻辑地址+1再次尝试。

例如:0%sizeof(Byte) = 0%1 = 0 表示能放下。

   1%sizeof(int) = 1%4 = 1  不等于0 ,逻辑地址会++

   补3个,找到下一个存放地址。

 

如表格所示:

其中值a为ASCII码 96(01100001)   a表示变量名称,同时为简化描述认为它的值也是a,类型Byte

其中值b为ASCII码 96(01100010)   b表示变量名称,同时为简化描述认为它的值也是b,类型int

采用单个变量复制法,内存空间x部分是随机值

01100001 x x x
01100010 00000000 00000000 00000000

采用memset方法,则把盲区初始化为0

01100001 0 0 0
01100010 00000000 00000000 00000000

 

C++中struct和class是等同的,唯一不同就是权限控制。

struct GetTableRecord
{
  char szDB[128];
  char szTB[128];
  char szShard[128];
  char szReportTime[128];
  int iTrans;
  int iTotal;

  GetTableRecord()
  {
    //使用memset清空本对象的内存区域

    memset(this, 0, sizeof(GetTableRecord));
  }
};

 

 

posted @ 2014-05-14 15:36  青梗墨竹  阅读(704)  评论(0)    收藏  举报