CR的代码文本

all for learning about the world
  订阅 订阅  :: 管理

register变量,又,指针,再,malloc/new

Posted on 2011-06-14 10:33  mumuliang  阅读(458)  评论(0编辑  收藏  举报

1.

频繁存取修改的变量,c中有个叫寄存器变量的好物。register声明只适用于函数参数和auto变量。但——寄存器变量是可以被编译忽略的。也就是说,通常没有多大必要在C++中使用它,除非是底层硬件编程。

 

2. 

指针变量必须要有一个类型说明符。比如int* p,这样的声明才完整。 

*表示其处存放的是地址,int表示从所指地址处开始往后sizeof(int)的区域就是p指示的内存区域。

一直困惑,虽然我知道int的大小,但操作系统如何知道?我知道int32* p是4byte长的区域的起始地址,但操作系统如何知道?p本身并没有携带空间长度信息。

更甚,void*,它如何知道自己这篇区域的长度?

原来。。。是这样:

分配地址,像c++对象模型用来记录UDT信息的结构体一样, 分配出来的区域头部会附着一个结构体用来记录该区域的大小。

参考:http://bbs.bccn.net/thread-81781-1-1.html 

用门牌号找到了那栋房子,门口插这一根牌子,上书“占地N坪”。就是这么简单。 

也就是说,实际分配的内存总是比申请时的多。 

 

3.

对于没有复杂构造函数的类和结构体,malloc和new效率没有区别。

debug百万个对象有几毫秒差距,release的这个差距几乎木有。

(release的效率大约是debug的一般,大概vs对debug做了啥米链接加速之类的?) 

总的来说,木甚区别。如有构造函数的话,当然就要视这片指令的宏伟程度了。

#include <stdio.h>
#include 
<Windows.h>

struct Vec3f
{
    
//Vec3f():x(0.f),y(0.f),z(0.f){;}
    float x;
    
float y;
    
float z;
};

struct VertexBuffer
{
    Vec3f        point; 
    Vec3f        normal;
    
float        texCoord[2];
};

int main()
{
    
const int num = 1000000;
    
int beginTick, endTick;

    beginTick 
= GetTickCount();
    printf(
"new begin: %d\n",beginTick);
    
for (int i=0 ;i<num; i++)
    {
        VertexBuffer
* tmp = new VertexBuffer;
        delete tmp; 
    }
    endTick 
= GetTickCount();
    printf(
"new end: %d, used: %d \n", endTick, endTick - beginTick);


    beginTick 
= GetTickCount();
    printf(
"begin: %d\n",beginTick);
    
for (int i=0 ;i<num; i++)
    {
        VertexBuffer
* tmp = (VertexBuffer*) malloc(sizeof(VertexBuffer*));
        free(tmp);
    }
    endTick 
= GetTickCount();
    printf(
"end: %d, used: %d \n", endTick, endTick - beginTick);


    system(
"PAUSE");

    
return 0;