周记(081124-081128)

1.
typedef struct ms1
{
     char a;
     int b;
} MS1;

在VC编译器中,sizeof(MS1)默认是8,而不是5,因为有内存对齐。合理安排结构体的字段声明顺序有时可以节省内存空间;
不同编译器默认的最大对齐字节数是不一样的,比如vc==8,gcc==4,可以通过#progma pack (n)来修改,分析程序的时候要注意编译器的区别;
double类型在vc里面alignment modulus == 8,而在gcc里面由于默认最大对齐个数是4,不设置的话,alignment modulus == 4.
详见:
http://blog.csdn.net/manbug/archive/2006/08/26/1124845.aspx

2.  移位运算符的优先级低于算术运算符,高于关系运算符,它们的结合方向是自左至右。如x-y<<4和x-(y<<4)是不一样的,前者相当于(x-y)<<4。

3.

C++类对应的内存结构:真空类大小为1;类内部的成员函数并不会影响类大小,成员数据才影响类大小。
详见:http://blog.csdn.net/guogangj/archive/2008/01/11/2036785.aspx

4. 在VC中使用调试堆来查程序的内存泄漏:

    (1)在头文件里(比如stdafx.h):
          #if defined(_DEBUG) && !defined(DEBUG_NEW)
          #define _CRTDBG_MAP_ALLOC
          #include <stdlib.h>
          #include <crtdbg.h>
          #define DEBUG_NEW new(_NORMAL_BLOCK,THIS_FILE,__LINE__)
          #endif
    (2)在cpp文件中的头部:
          #ifdef _DEBUG
          #define new DEBUG_NEW
          #undef THIS_FILE
          static char THIS_FILE[] = __FILE__;
          #endif

     这样,当在debug模式下按F5运行程序,当程序退出时,若有内存泄漏,则会在Output窗口显示是哪个文件的哪一行代码发生内存泄漏。

5. Euler Angle和Quaternion之间的关系:
     q=[cos(angle/2),sin(angle/2)axis]
     其中:q为四元数(单位四元数);angle为旋转角;axis为一向量,是旋转轴

     sina=sqrt(1-qw×qw)
     angle=2×cos-1(qw)

     axisx=qx/sina
     axisy=qy/sina
     axisz=qz/sina

posted @ 2008-11-28 22:54  Skyman  阅读(636)  评论(5编辑  收藏  举报