Chinaunix首页 | 论坛 | 博客
  • 博客访问: 192654
  • 博文数量: 44
  • 博客积分: 1515
  • 博客等级: 上尉
  • 技术积分: 480
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-06 16:39
文章分类

全部博文(44)

文章存档

2013年(3)

2012年(2)

2011年(2)

2009年(20)

2008年(17)

我的朋友

分类: C/C++

2008-11-01 02:08:13

凌晨1:18 开始写点关于内存对其的思考.
首先在代码中有这样一个声明:
CHI_PLAY_AudioOut    m_AudioOut;
其中
class CHI_PLAY_AudioOut{
.....................

CL_MS_FIFO m_Audio_RB;

........................
};

类CL_MS_FIFO:
class CL_MS_FIFO{
.......................

unsigned int  m_ulSize;            
MS_U8    *m_pRB;               
unsigned int  m_ulWritePos;      
unsigned int  m_ulReadPos;   

............................
};

在开发过程发现,声明m_AudioOut时会调用m_AudioOut的构造函数,在该构造函数中调用 m_Auido_RB.RB_Init 函数对m_Audio_RB进行初始化,初始化后
m_Audio_RB.m_ulWritePos = 0; 然而跟踪发现,在RB_Init函数中 m_ulWritePos == 0 然而在m_AudioOut的构造函数中 m_Audio_RB.m_ulWritePos != 0, 有时很大.

在该声明语句设断点, 如图debug1_.jpg所示
&(m_AudioOut.m_Audio_RB.m_ulWritePos) 的值为:
0x06a8fec6
在断点窗口中选择DATA ,填写 *(unsigned int *)(0x06a8fec6) != 0 继续执行.程序中断,如图debug2.bmp所示.
发现 &(m_ulWritePos) = 0x06a8fecc .真是大吃一惊!!!!!!!!!!!!
    且此时 *( unsigned int * ) ( 0x06a8fec6) = 11534340 (即 0xb00004);
    &(m_ulSize) = 0x06a8fec4 ;
    &(m_pRB) = 0x06a8fec8;
    m_ulSize = 262144 (即 0x40000 )
    m_pRB = 0x047c00b0;
   
*( unsigned int * ) ( 0x06a8fec6)的值刚好是 m_ulSize的高四位和m_pRB的低四位组成(牵涉到大端 和小端,我的机器是小端字节序).使用F10 跳过该断点,一直到 m_AudioOut声明处的下一条语句.如图debug3_.jpg所示

此时m_AudioOut.m_Audio_RB.m_ulWritePos = 11534340 (即 0xb00004);
我大胆猜想编译器可能因为某种原因在使得计算m_ulWritePos的地址有偏差,这种原因最有可能是内存对其.

在相关类的定义地方 添加语句:
#pragma pack( push )
#pragma pack( 8 )
......
#pragma pack ( pop )
问题解决.
在不同的函数体内,类的成员地址不同,原因是有内存对其导致.然而为什么会导致这个问题,我还没有搞清楚.


阅读(539) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~