随笔 - 30, 文章 - 0, 评论 - 64, 引用 - 0
数据加载中……

在堆上分配内存

unsigned long *pA = new unsigned long; *pA = 10;
unsigned long *pB = new unsigned long[ *pA ];

上面就申请了两块内存,pA所指的内存(即pA的值所对应的内存)是4字节大小,而pB所指的内存是4*10=40字节大小。应该注意,由于new是一个操作符,其结构为new <类型名>[<整型数字>]。它返回指针类型的数字,其中的<类型名>指明了什么样的指针类型,而后面方括号的作用和定义数组时一样,用于指明元素的个数,但其返回的并不是数组类型,而是指针类型。



delete pA; delete[] pB;

    注意delete操作符并不返回任何数字,但是其仍被称作操作符,看起来它应该被叫做语句更加合适,但为了满足其依旧是操作符的特性,C++提供了一种很特殊的数字类型——void。其表示无,即什么都不是,这在《C++从零开始(七)》中将详细说明。因此delete其实是要返回数字的,只不过返回的数字类型为void罢了。

    注意上面对pA和pB的释放不同,因为pA按照最开始的书写,是new unsigned long返回的,而pB是new unsigned long[ *pA ]返回的。所以需要在释放pB时在delete的后面加上“[]”以表示释放的是数组,不过在VC中,不管前者还是后者,都能正确释放内存,无需“[]”的介入以帮助编译器来正确释放内存,因为以Windows为平台而开发程序的VC是按照Windows操作系统的方式来进行内存分配的,而Windows操作系统在释放内存时,无需知道欲释放的内存块的长度,因为其已经在内部记录下来(这种说法并不准确,实际应是C运行时期库干了这些事,但其又是依赖于操作系统来干的,即其实是有两层对内存管理的包装,在此不表)。

posted @ 2008-11-26 15:40 henry08 阅读(338) | 评论 (0)编辑 收藏

指针

再来看取内容操作符“*”,其右接的数字类型是指针类型或数组类型,它的计算就是将此指针类型的数字直接转换成地址类型的数字
因为指针类型的数字和地址类型的数字在数值上是相同的,仅仅计算规则不同


地址类型的数字是在编译时期给编译器用的
指针类型的数字是在运行时期给代码用的

posted @ 2008-11-26 15:39 henry08 阅读(137) | 评论 (0)编辑 收藏

申请内存 静态分配动态分配

在申请内存时总是申请固定大小的内存,则称此内存是静态分配的。前面提出的定义变量时,编译器帮我们从栈上分配的内存就属于静态分配


根据用户输入的不同而可能申请不同大小的内存时,则称此内存是动态分配的,后面说的从堆上分配就属于动态分配。


同样,静态分配的内存利用率不高或运用不够灵活,但代码容易编写且运行速度较快;动态分配的内存利用率高,不过编写代码时要复杂些,需自己处理内存的管理(分配和释放)且由于这种管理的介入而运行速度较慢并代码长度增加。
静态和动态的意义不仅仅如此,其有很多的深化,如硬编码和软编码、紧耦合和松耦合,都是静态和动态的深化。

posted @ 2008-11-26 15:38 henry08 阅读(814) | 评论 (0)编辑 收藏

字符串

 char类型进行表示的字符串称为单字节字符串(SingleByte),用这种表示方式记录的文本文件称为是ANSI格式的

  多字节字符串(MultiByte),用这种表示方式记录的文本文件称为是MBCS格式的

 宽字节字符串(WideChar),用这种表示方式记录的文本文件称为是Unicode格式的
         (一个short类型的数字来表示,即每个字符的长度固定为2字节)

posted @ 2008-11-26 15:37 henry08 阅读(167) | 评论 (0)编辑 收藏

在线C++编译器介绍

下面的网址是最有名的两个在线C++编译网站:

http://www.dinkumware.com/exam/default.aspx
http://www.comeaucomputing.com/tryitout/
许多在线判题系统也可以用来进行在线编译:

http://acm.zju.edu.cn/
http://acm.pku.edu.cn/JudgeOnline/
http://acm.uva.es/
你可能会好奇这些网站使用的编译器的版本和编译参数到底是什么。有些网站会提供这些信息,而有些则不会。那么你就只能靠自己去发现这些“秘密”了。

工欲善其事,必先利其器。让我们先看看一些从编译器获取信息的小技巧。

1. 输出宏
在C++中, 字符串常数不能作为模板参数。大多数编译器会在错误信息中同时输出字符串的内容。下面的代码展示了这一技巧。

template<const char *> class A {};
#define F0(x) #x
#define F1(x) F0(x)
#define V1 F1(__GNUC__)
int main()
{
    A<V1> a1;
}


这里,宏F0和F1用于将整型转换成字符串。编译器会输出类似于"literal "3" is not a valid template argument because it is the address of an object with static linkage"的出错信息。里面的"3"就是你想知道的宏的内容。

2. 输出常数
同样,浮点数是不能作为模板参数的。编译器通常会在错误信息中包含浮点数的值。利用这一点,我们可以输出浮点常数。不过很不幸的是,VC会隐式的将浮点类型的模板参数转换成int(参见https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=296008
下面是一种输出整型常量的方法:

template<int N>
class A
{
private:
    A();
};
int main()
{
    A<sizeof(char)> a;
}


3. 输出变量类型
有时候,你可能需要知道某些变量的实际类型,这时候你可以使用下面的代码:

struct Dummy {};
void Fun(const Dummy &);
int main()
{
    Fun(1+1U);
}


PS:如果你使用的是gcc,那么它会输出"not convert `2' to `const Dummy&'",所以你需要将Fun的声明改成"template<typename T> void Fun(T);"(换句话说,在gcc中上面的代码也可以用于输出常数的值)

4. 输出包含路径
如果要获取STL头文件的路径,你可以使用:

#include <ext/hash_set>
using __gnu_cxx::hash_set;

int main()
{
    hash_set<> m;
}

 

PS:这里也可以使用vector。

好,现在是时候牛刀小试了。关于如何获取编译器的版本信息,可以参考这篇文章:Pre-defined Compiler Macros

下面是利用上面介绍的技巧获得的dinkumware网站的一些资料:

1. VC
版本 (_MSC_FULL_VER):
         VC8 140050727
         VC7.1 13103077
         VC7 13009466
         VC6 12008804
包含路径:
         D:\cplt501_vc_source\include (with _CPPLIB_VER=501)

2. EDG
版本(__EDG_VERSION__):
         3.05 
编译参数:
         edgcc --alt -D_WIN32 -D_M_IX86 --no_inlining --diag_suppress=1290 --long_long --wchar_t_keyword -D_C99 -ID:\cplt501_gen_source/include/c -ID:\cplt501_gen_source/include -IC:\PROGRA~1\MICROS~2.NET\VC7/include --exceptions --microsoft -c sourceFile.cpp
因为使用了VC兼容模式进行编译,所以编译器可能会模拟VC的部分bug

3. GCC
版本:
         3.2.0
包含路径:
         D:/cplt501_gen_source/include and D:/Mingw/include/c++/3.2/
可以看到这里使用的GCC的版本已经相当陈旧了

 

 

 

 

 

 

 


文章出处:http://www.diybl.com/course/3_program/c++/cppsl/2008108/149011.html

posted @ 2008-11-26 12:35 henry08 阅读(3418) | 评论 (2)编辑 收藏

赋值语句

赋值语句
因此应在变量定义的时候就进行赋值(但是会有性能上的影响,不过很小),以初始化变量而防止出现莫名其妙的值,在表达式中运用赋值运算符是不好的,即使它可能让你写出看起来简练的语句,但它也使代码的可维护性降低。


true 0
false 非0

posted @ 2008-11-26 00:18 henry08 阅读(915) | 评论 (0)编辑 收藏

栈(Stack) 堆(Heap)


C++即允许程序员有两种向操作系统申请内存的方式。
    前一种就是在栈上分配,申请的内存大小固定不变
    后一种是在堆上分配,申请的内存大小可以在运行的时候变化,不是固定不变的
_______+++++++++++++++++++++++++++++++++++_____________________________




栈(Stack)
                   
                  : 任何程序执行前,预先分配一固定长度的内存空间,
                    这块内存空间被称作栈,也被叫做堆栈
                    即程序员自己判断可以使用哪些内存,
                    而不是操作系统,很明显,
                   上面的工作是由编译器来做的,   
                   工作只是从操作系统变到程序自己而已,
                   好处就是由于程序一开始执行时就已经分配了一大块连续内存,
                   坏处也就是只能在编译时期分配内存


上面的工作是编译器做的,即程序员并不参与堆栈的维护。但上面已经说了,堆栈相当于在编译时期分配内存,因此一旦计算好某块内存的偏移,则这块内存就只能那么大,不能变化了


__________________________________________________________________________________________________

堆(Heap)

                
在Windows操作系统下,由操作系统分配的内存就叫做堆
                 而栈可以认为是在程序开始时就分配的堆
                 因此在堆上就可以分配大小变化的内存块,
                 因为是运行时期即时分配的内存,
                而不是编译时期已计算好大小的内存块。

posted @ 2008-11-24 18:45 henry08 阅读(1008) | 评论 (1)编辑 收藏

挑战30天C/C++ 入门极限系列教程

挑战30天C/C++ 入门极限系列教程

C++从零开始系列教程目录
http://www.bianceng.cn/Programming/cplus/jc/200705/659.htm

posted @ 2008-11-23 21:56 henry08 阅读(470) | 评论 (0)编辑 收藏

Visual C++ 2005 系列课程学习笔记

 

http://www.cnblogs.com/kai_xin/category/153770.html

posted @ 2008-11-23 21:38 henry08 阅读(203) | 评论 (0)编辑 收藏

c++ 开blogs

c++  开blogs

posted @ 2008-11-11 15:35 henry08 阅读(148) | 评论 (0)编辑 收藏

仅列出标题
共3页: 1 2 3