??xml version="1.0" encoding="utf-8" standalone="yes"?> 2.从标准头文g说v #ifndef __INCvxWorksh 昄Q头文g中的~译?#8220;#ifndef __INCvxWorksh?define __INCvxWorksh?endif” 的作用是防止该头文g被重复引用。那?/font> 的作用又是什么呢Q我们将在下文一一道来?/font> 3.深层揭密extern "C" extern int a; void foo( int x, int y ); 同样圎ͼC++中的变量除支持局部变量外Q还支持cL员变量和全局变量。用h~写E序的类成员变量可能与全局变量同名Q我们以"."来区分。而本质上Q编译器在进行编译时Q与函数的处理相|也ؓcM的变量取了一个独一无二的名字,q个名字与用L序中同名的全局变量名字不同?br> // 模块A头文件 moduleA.h // 模块B实现文g moduleB.cpp // 模块A头文件 moduleA.h 4.extern "C"的惯用法 extern "C" /* c语言头文ӞcExample.h */ //C++头文?cppExample.h Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=763734#include <iostream>
2
3using namespace::std;
4//in function ,will be initialized.Include main fuction.
5//out of function, willn't be.
6void fun()
7{
8 int A[4] =
{};//call initialize
9 int C[4] =
{1};
10 cout <<"funA:"<<A[0]<<","<<A[1]<<endl;
11 cout <<"funC:"<<C[0]<<","<<C[1]<<endl;
12}
13int B[4];
14int main()
15{
16
17 int A[8];// in main function
18 fun();
19 cout <<"main funA:"<<A[0]<<","<<A[1]<<endl;
20 cout <<"GlobalB:"<<B[0]<<","<<B[1]<<endl;
21
22 getchar();
23 return 0;
24}
25
]]>int a =2, b=3, c = 5, d = 6, e = 0, f = 9;
2e = a > b?
3 (c = 6, d = 7)
4 :(c = 7, d = 8, f);
5cout <<c<<d<<e;
]]>char* test[] =
{"1", "12", "123"};
2 int a,b,c, d, e;
3 a = sizeof(test);
4 b = sizeof(test[0]);
5 c = sizeof(test[1]);
6 d = sizeof(test[2]);
7 e = a/b;
8 char f = test[0][0];
9 char g = test[0][1];
10 char h = test[0][2];
11 char i = test[0][3];
12 printf("a%d,b%d,c%d,d%d,e%d, f%d, g%d, h%d, i%d", a, b, c, d, e, f, g, h, i);
13
14 typedef struct
15
{
16 char a[5];
17 char b[6];
18 }teststruct;
19
20 teststruct t1=
{"1", "a"};
21 teststruct testst[]=
{
{"1", "a"},
{"12", "ab"},
{"123", "abc"},
{"1234", "abcd"}};
22 teststruct t2;
23 printf("%s, %s, %s, %s", t2.a, t2.b, t1.a, t1.b);
24 printf("%d, %d, %d, %d, %d, %d", testst[1].a[0], testst[1].b[0], testst[1].a[1], testst[1].b[1], testst[1].a[4], testst[1].b[4]);
25
]]>
C++语言的创建初h“a better C”Q但是这q不意味着C++中类似C语言的全局变量和函数所采用的编译和q接方式与C语言完全相同。作ZU欲与C兼容的语aQC++保留了一部分q程式语a的特点(被世人称?#8220;不彻底地面向对象”Q,因而它可以定义不属于Q何类的全局变量和函数。但是,C++毕竟是一U面向对象的E序设计语言Qؓ了支持函数的重蝲QC++对全局函数的处理方式与C有明昄不同?/font>
某企业曾l给出如下的一道面试题Qؓ什么标准头文g都有cM以下的结构?
#define __INCvxWorksh
#ifdef __cplusplus
extern "C" {
#endif
/*...*/
#ifdef __cplusplus
}
#endif
#endif /* __INCvxWorksh */
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
}
#endif
extern "C" 包含双重含义Q从字面上即可得刎ͼ首先Q被它修饰的目标?#8220;extern”的;其次Q被它修饰的目标?#8220;C”的。让我们来详l解读这两重含义?br>
被extern "C"限定的函数或变量是externcd的;
extern是C/C++语言中表明函数和全局变量作用范围Q可见性)的关键字Q该关键字告诉编译器Q其声明的函数和变量可以在本模块或其它模块中使用。记住,下列语句Q?br>
仅仅是一个变量的声明Q其q不是在定义变量aQƈ未ؓa分配内存I间。变量a在所有模块中作ؓ一U全局变量只能被定义一ơ,否则会出现连接错误?br>
通常Q在模块的头文g中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。例如,如果模块BƲ引用该模块A中定义的全局变量和函数时只需包含模块A的头文g卛_。这P模块B中调用模块A中的函数Ӟ在编译阶D,模块B虽然找不到该函数Q但是ƈ不会报错Q它会在q接阶段中从模块A~译生成的目标代码中扑ֈ此函数?br>
与extern对应的关键字是staticQ被它修饰的全局变量和函数只能在本模块中使用。因此,一个函数或变量只可能被本模块用时Q其不可能被extern “C”修饰?br>
被extern "C"修饰的变量和函数是按照C语言方式~译和连接的Q?br>
未加extern “C”声明时的~译方式
首先看看C++中对cMC的函数是怎样~译的?br>
作ؓ一U面向对象的语言QC++支持函数重蝲Q而过E式语言C则不支持。函数被C++~译后在W号库中的名字与C语言的不同。例如,假设某个函数的原型ؓQ?
该函数被C~译器编译后在符号库中的名字为_fooQ而C++~译器则会生像_foo_int_int之类的名字(不同的编译器可能生成的名字不同,但是都采用了相同的机Ӟ生成的新名字UCؓ“mangled name”Q?br>
_foo_int_intq样的名字包含了函数名、函数参数数量及cd信息QC++是靠这U机制来实现函数重蝲的?/span>例如Q在C++中,函数void foo( int x, int y )与void foo( int x, float y )~译生成的符h不相同的Q后者ؓ_foo_int_float?/font>
未加extern "C"声明时的q接方式
假设在C++中,模块A的头文g如下Q?br>
#ifndef MODULE_A_H
#define MODULE_A_H
int foo( int x, int y );
#endif
在模块B中引用该函数Q?br>
#include "moduleA.h"
foo(2,3);
实际上,在连接阶D,q接器会从模块A生成的目标文件moduleA.obj中寻找_foo_int_intq样的符P
加extern "C"声明后的~译和连接方?/strong>
加extern "C"声明后,模块A的头文g变ؓQ?br>
#ifndef MODULE_A_H
#define MODULE_A_H
extern "C" int foo( int x, int y );
#endif
在模块B的实现文件中仍然调用foo( 2,3 )Q其l果是:
Q?Q模块A~译生成foo的目标代码时Q没有对其名字进行特D处理,采用了C语言的方式;
Q?Q连接器在ؓ模块B的目标代码寻找foo(2,3)调用ӞL的是未经修改的符号名_foo?br>
如果在模块A中函数声明了foo为extern "C"cdQ而模块B中包含的是extern int foo( int x, int y ) Q则模块B找不到模块A中的函数Q反之亦然?br>
所以,可以用一句话概括extern “C”q个声明的真实目的(M语言中的M语法Ҏ的诞生都不是随意而ؓ的,来源于真实世界的需求驱动。我们在思考问题时Q不能只停留在这个语a是怎么做的Q还要问一问它Z么要q么做,动机是什么,q样我们可以更深入地理解许多问题Q:
实现C++与C及其它语a的合编E?br> 明白了C++中extern "C"的设立动机,我们下面来具体分析extern "C"通常的用技巧?/font>
Q?Q在C++中引用C语言中的函数和变量,在包含C语言头文Ӟ假设为cExample.hQ时Q需q行下列处理Q?br>
{
#include "cExample.h"
}
而在C语言的头文g中,对其外部函数只能指定为externcdQC语言中不支持extern "C"声明Q在.c文g中包含了extern "C"时会出现~译语法错误?br>
W者编写的C++引用C函数例子工程中包含的三个文g的源代码如下Q?br>
#ifndef C_EXAMPLE_H
#define C_EXAMPLE_H
extern int add(int x,int y);
#endif
/* c语言实现文gQcExample.c */
#include "cExample.h"
int add( int x, int y )
{
return x + y;
}
// c++实现文gQ调用addQcppFile.cpp
extern "C"
{
#include "cExample.h"
}
int main(int argc, char* argv[])
{
add(2,3);
return 0;
}
如果C++调用一个C语言~写?DLLӞ当包?DLL的头文g或声明接口函数时Q应加extern "C" { }?br>
Q?Q在C中引用C++语言中的函数和变量时QC++的头文g需dextern "C"Q但是在C语言中不能直接引用声明了extern "C"的该头文Ӟ应该仅将C文g中将C++中定义的extern "C"函数声明为externcd?br> W者编写的C引用C++函数例子工程中包含的三个文g的源代码如下Q?br>
#ifndef CPP_EXAMPLE_H
#define CPP_EXAMPLE_H
extern "C" int add( int x, int y );
#endif
//C++实现文g cppExample.cpp
#include "cppExample.h"
int add( int x, int y )
{
return x + y;
}
/* C实现文g cFile.c
/* q样会编译出错:#include "cExample.h" */
extern int add( int x, int y );
int main( int argc, char* argv[] )
{
add( 2, 3 );
return 0;
}
如果深入理解了第3节中所阐述的extern "C"在编译和q接阶段发挥的作用,p真正理解本节所阐述的从C++引用C函数和C引用C++函数的惯用法。对W?节给出的CZ代码Q需要特别留意各个细节?br>
]]>
/**/
/*
char 是最的可操作单?/span>
*/
char
str[
20
]
=
"
987654321
"
;
char
*
ch
=
str;
char
*
test
=
"
987654321
"
;
]]>
ftp://210.32.157.56/课g/c++primer/vc++技术内qIV(潘爱?.rar
2.C++l典对话pd
中文Qhttp://www.jka77.com/book/cvst_cn.chm
3.MFC Windows E序设计(W二?
英文版:http://www.jka77.com/book/progmfc2.chm
中文版:暂无Q制作中...
4.Effective C++中文版:
http://dlb.pchome.net/development/reference/effectiveCplus.zip
5.More Effective C++中文?zhc?
http://cable.pchome.net/development/reference/MEC0410.zip
6.More Effective C++中文?候捷?
http://www.nethovel.com/resources/MoreEffectiveC++(WQ).zip
7.Essential C++中文??Q候捷?
http://www.nethovel.com/resources/Essential%20C++中文??.rar
8.深入出MFC 2/e
http://218.30.21.125:8084/ebook/programme/mfc2e.zip
9.代码大全中文?
http://www.delphidevelopers.com/docs/tecsubject/cc/CodeComplet110.zip
11.C++l典对话pd
中文Qhttp://www.jka77.com/book/cvst_cn.chm
12.MFC Windows E序设计(W二?
英文版:http://www.jka77.com/book/progmfc2.chm
中文版:暂无Q制作中...
13.数据l构 C++ 语言描述(中文?
http://www.code-labs.com/manual/c_c015.zip
14.Java~程思想中文?
ftp://202.118.72.12/pub/doc-book/Java/Java~程思想.zip
15.C++标准库英文版
ftp://166.111.64.4/incoming/新文件夹/f/The%20C++%20Standard%20Library(with%20TOC).pdf
16.Windows核心~程
英文Qhttp://www.fmdstudio.net/book/prgapps4.zip
17.TCP-IP详解?Q协?
ftp://202.204.4.161/学习资料/TCPIP/TCP-IP详解?Q协?pdf
18.TCP-IP详解?Q实?
ftp://202.204.4.161/学习资料/TCPIP/TCP-IP详解?QTCP事务协议QHTTPQNNTP.pdf
19.TCP-IP详解?QTCP事务协议
ftp://202.204.4.161/学习资料/TCPIP/TCP-IP详解?Q实?pdf
20.实用法的分析与E序设计
ftp://202.204.8.10/[4]%20~程资源/[%20书籍资料%20]/[法与数据结构]/实用法的分析与E序设计.rar
21.vc++技术内q第四版 (潘爱?
ftp://210.32.157.56/课g/c++primer/vc++技术内qIV(潘爱?.rar
22.C++ Primer英文版:
http://computerstep.w18.net/C/C++%20Primer.zip
23.Effective C++中文版:
http://dlb.pchome.net/development/reference/effectiveCplus.zip
24.More Effective C++中文?zhc?
http://cable.pchome.net/development/reference/MEC0410.zip
25.More Effective C++中文?候捷?
http://www.nethovel.com/resources/MoreEffectiveC++(WQ).zip
26.Essential C++中文??Q候捷?
http://www.nethovel.com/resources/Essential%20C++中文??.rar
27.Programming WindowsE式开发设计指南-Petzoldi?余孟??
中文版:http://www.nethovel.com/resources/ProgrammingWindows_tw.chm
英文版:http://www.nethovel.com/resources/Petzoldi.chm
28.WinAsm32汇编教程Q?Iczelion
http://www.nethovel.com/resources/winasm.chm
29.Windows 95 E序设计指南Q候捷?
http://www.nethovel.com/resources/win95adg.zip
30.Thinking in C++ 2nd Edition(C++~程思想)
英文版:http://www.nethovel.com/resources/ThinkinginC++.zip
中文版:http://www.dingbing.com/book/thinkc.zip
31.人月话Q中文版
http://www.goodassister.com/book/rysh.pdf
32.The C++ Programming Language英文
http://computerstep.w18.net/C/The%20C++%20Programming%20Language.rar
33.VC技术内q第五版 http://www.helpwork.com/downdata/book/programming/vc/book/vc++2/invcpp5.chm
34.com技术内q?
http://www.helpwork.com/book/html/user/download.asp?id=1123
35.comQ技术内q?
http://www.helpwork.com/book/html/user/download.asp?id=952
36.新编 Windows API参考大?
http://www.4046.com/nnsrc/down/WindowsAPIdq.rar
37.The C programming Language // By Brian W. Kernighan and Dennis M. Ritchie
下蝲地址Qhttp://www.jka77.com/book/The_C_programmin.chm
38.C语言~程手册
下蝲地址Qhttp://www.jka77.com/book/CL.chm
39.Delphi 7高效数据库程序设?
By 李维
下蝲地址:http://www.codestudy.net/book/download.asp?id=1163&sort=5
40.Windows|络~程(W??
By Anthony Jones,Jim Ohlund 清华大学出版C?
下蝲地址Q英文版:http://www.guxiang.com/epubcn/readings/diannaotushu/500/download/1107/network_prog_for_win_2nd.zip
41.Windows2000~程技术内q?
By Mickey Williams 机械工业出版C?
下蝲地址Qftp://ftp.frontfree.net/Pub/Books/C&C++/VC/Windows2000~程技术内q?rar
42.数据仓库
By W.H.Inmon 清华大学出版C?
下蝲地址1Qhttp://tips.9hao.com/vvbksd/20011120/数据仓库.zip
下蝲地址2: ftp://ftp.math.nankai.edu.cn/Ebook/China-pub/chinapub_computerscience_multimedia/ComputerScience/%CA%FD%BE%DD%B2%D6%BF%E2/
43.~码的奥U?
By Charles Petzold 机械工业出版C?
下蝲地址Qftp://ftp.math.nankai.edu.cn/Ebook/China-pub/chinapub_computerscience_multimedia/ComputerScience/%B1%E0%C2%EB%B5%C4%B0%C2%C3%D8/
44.~译原理及实?
By Louden, K.C 机械工业出版C?
下蝲地址Qftp://ftp.math.nankai.edu.cn/Ebook/China-pub/chinapub_computerscience_multimedia/ComputerScience/%B1%E0%D2%EB%D4%AD%C0%ED%BC%B0%CA%B5%BC%F9/
45.Inside C++ Object Model(深度探烦C++对象模型Q?
By Lippman 候捷?
下蝲地址Qhttp://www.jka77.com/book/inside-the-cpp-object-model.pdf
46.C++标准E序?
By Josuttis
下蝲地址1Qhttp://www.codestudy.net/book/download.asp?id=1205&sort=5
下蝲地址2: ftp://ftp.math.nankai.edu.cn/Ebook/C_C++/The Cpp Standard Library.pdf
47.STL源码剖析
By 候捷
下蝲地址Qftp://ftp.math.nankai.edu.cn/Ebook/C_C++/STL源码剖析--侯捷.pdf
48.C++批判(W三? -看看C++的坏话!
By I don't know
下蝲地址Qhttp://www.jka77.com/book/CPPPP.pdf
49.E序设计实践
下蝲地址Qftp://ftp.math.nankai.edu.cn/Ebook/China-pub/chinapub_computerscience_multimedia/%B3%CC%D0%F2%C9%E8%BC%C6%CA%B5%BC%F9/
50.c++沉思录
By Andrew Koenig Barbara Moo 人民邮电出版C?
下蝲地址Qhttp://www.codestudy.net/book/download.asp?id=1261&sort=5
51.C++Builder4技术内q?(q本书俺不知道好不好Q?
By I don't Know
下蝲地址Qhttp://www.codestudy.net/book/download.asp?id=1254&sort=5
52.下面两本书一般大家硬盘里都有的吧Q而且很老了Q但是ؓ了全面,提上来?
(1)Windows 95 E式设计指南 - 候捷
下蝲地址Qhttp://jjhou.csdn.net/win95-a-developers-guide.pdf
(2)Windows 95 pȝE式设计大奥U?- 候捷
下蝲地址Qhttp://jjhou.csdn.net/windows95-system-programming-secrets.pdf
53. 中国大百U全书h?
下蝲地址Qftp://ftp.math.nankai.edu.cn/Ebook/中国大百U全?中国大百U全书h?pdf
54?.0M Bjarne Stroustrup - The C++ Programming Language
http://www.u-n-f.com/books/archive/The%20C++%20Programming%20Language.tar.gz
55?.0M Richard Stevens - TCP-IP Illustrated
http://www.u-n-f.com/books/archive/TCP-IP%20Illustrated.tar.gz
56?.5M Randall Hyde - Art Of Assembly
http://www.u-n-f.com/books/archive/Randall%20Hyde%20-%20Art%20Of%20Assembly.tar.gz
57?.1M M. Abrash - Zen of Graphics Programming
http://www.u-n-f.com/books/archive/M.%20Abrash%20-%20Zen%20of%20Graphics%20Programming.zip
58?49k Kernighan and Ritche - The C Programming Language
http://www.u-n-f.com/books/archive/Kernighan%20and%20Ritchie%20-%20The%20C%20Programming%20Language.zip
59?.3M Bruce Schneier - Applied Cryptography
http://www.u-n-f.com/books/archive/Bruce%20Schneier%20-%20Applied%20Cryptography.zip
60、PHP4_Grundlagen_und_Profiwissen
http://www.u-n-f.com/books/archive/lamp/PHP4_Grundlagen_und_Profiwissen.pdf
61.《C++ Builder高~程技术?
http://www.dingbing.com/book/builder.zip
62.《VC++ 6.0 TLR 模板库参考手册?
http://www.easysea.com/diannao/download/prog/c/mbkc.zip
63.《BORLAND C++ BUILDER 实用培训教程?
http://202.101.232.120/book/openfile.asp?id=223&filename=BC98_CB526.zip
64.《Delphi高开发指南?
http://www.pcbookcn.com/s10899book/program/delphi/Delphi_gjkfzn_for3.rar
65.《新~?Windows API参考大全?
ftp://book:book@down.pcbookcn.com/pro/delphi/新编Windows_API_参考大?rar
66.《Delphi深度历险-附书源码?
http://www.pcbookcn.com/s10899book/program/delphi/Delphi_sdlx_code.rar
67.《Delphi 7高效数据库程序设计?
ftp://book:book@down.pcbookcn.com/pro/delphi/李维的新书《Delphi7高效数据库程序设计?rar
68.《Delphi7开发指南?
ftp://book:book@down.pcbookcn.com/pro/delphi/delphi7开发指?rar
69.《Delphi6集成开发环境?
ftp://book:book@down.pcbookcn.com/pro/delphi/Delphi6集成开发环?rar
70.《Delphi6数据库编E?
ftp://book:book@down.pcbookcn.com/pro/delphi/Delphi6数据库编E?rar
72.《Delphi5.xADO_MTS_COM+高E序设计?
ftp://book:book@down.pcbookcn.com/pro/delphi/Delphi5.xADO_MTS_COM+高E序设计?rar
73.《VISUAL BASIC ~程标准?
http://www.dingbing.com/book/vb.zip
74.《Visual Basic6.0中文版程序员指南?
http://www.easysea.com/diannao/download/prog/vb/zwbc.zip
75.《Visual Basic 6.0 控g参考手册?
http://www.easysea.com/diannao/download/prog/vb/kjck.zip
76.《Visual Basic 6.0中文版语a参考手册?
http://www.easysea.com/diannao/download/prog/vb/zwby.zip
77.《Visual Basic 6.0 开发宝典?
http://www.easysea.com/diannao/download/prog/vb/kfbd.zip
78.《Visual Basic 6.0 实例教程?
http://www.easysea.com/diannao/download/prog/vb/sljc.zip
79.《VB 6.0 中文版实用参考手册?
http://www.easysea.com/diannao/download/prog/vb/syck.zip
80.《Visual Basic 6开发h员指南?
http://www.easysea.com/diannao/download/prog/vb/kfzn.zip
81.《VB ?SQL Server ~程指南Q第五版Q?
http://www.easysea.com/diannao/download/prog/vb/bczn.zip
82.《Jbuilder 5 中文帮助?
http://www.pdown.net/download.asp?downid=2&id=991
83.《JBuilder开发h员指南?
http://youth.dlmu.edu.cn/book/list_down.php?bkid=224
84.《Win32的Internet函数说明?
档案大小Q?245248K
http://www.easysea.com/diannao/download/prog/windows/win32int.zip
85.《Visual InterDev 从入门到_N?
http://www.easysea.com/diannao/download/prog/interdev/crmd.wdl
86.《Visual InterDev 6.0 Web 参考手??
http://www.easysea.com/diannao/download/prog/interdev/jsck.zip
87.《Visual InterDev 6.0 Guide E序员?
http://www.easysea.com/diannao/download/prog/interdev/cxyz.zip
88.《JavaScript E序开发手册?
http://www.cty99.com/Templet/bookdownmore.asp?booktype=script#
89.《JAVA 大全?
http://www.easysea.com/diannao/download/prog/java/cxkf.zip
90.《Visual J++ 6.0 WFC cd参考手册?
http://www.easysea.com/diannao/download/prog/java/lkck.zip
91.《Java联想Q中文)?
http://www.easysea.com/diannao/download/prog/java/lkck.zip
92.《Oracle 8 实用大全?
http://www.easysea.com/diannao/download/prog/oracle/sydq.zip
93.《Microsoft SQL Server 理员手册?
http://www.easysea.com/diannao/download/prog/sql/glys.zip
94.《掌握ACCESS开发?
http://www.easysea.com/diannao/download/prog/sql/glys.zip
95.《Oracle Performance Tuning and Optimization?
http://www.oradb.net/book/oracle_pt.zip
96.《Oracle ProC E序设计?
http://www.oradb.net/book/oracleproc.zip
97.《Oracle8初学者指南?
http://www.easysea.com/diannao/download/prog/oracle/cxzz.zip
98.《RED HAT LINUX 6大全?
http://www.dingbing.com/book/redhatall.zip
99.《RED HAT LINUX 6理工具?
http://www.dingbing.com/book/redhatman.zip
100.《VC++高~程?
http://www.easysea.com/diannao/download/prog/c/vcgj.zip
]]>
2、profiler工具可以用来查程序效率?br />
3、文件A
funtion f
文gB
#include "A"
extern f
此处用法错误Q对函数fq行了重定义?/font>
本文旨在介绍配合使用 NetBeans Profiler v5.0 ?Profiler Milestone 8 的内宏V如果您使用的是 Milestone 5Q请使用此版?/a>。如果您使用的是 Milestone 6Q请使用此版?/a>?/p> 预计持箋旉Q?0 分钟 NetBeans Profiler 是一个功能强大的工具Q它提供了有兛_用程序运行时行ؓ的重要信息。NetBeans Profiler 产生的开销相对来说较小Q它可以跟踪U程状态、CPU 性能和内存用情c本教程向您介l如何?NetBeans Profiler 来完成以下操作: 本教E假定您已经h了一些基本的 Java ~程?NetBeans IDE 使用l验?/p>先决条g
教程所需的YӞ
本文使用的表C法
在开始学习教E之前,请先查以下内容:
在本l习中,您将学习如何使用 NetBeans Profiler 监视 J2SE 应用E序中的U程状态。这P您就可以诊断样例应用E序中的性能问题?
Swing 库ؓ J2SE 应用E序提供了图形用L面组件。Swing 库会使用到多个线E,利用 NetBeans Profiler q一功能强大的工P您可以分析出每个U程所p的处理时_从而利用这些分析信息来解决性能问题?
选择“性能分析?gt;“高U命令?gt;“运行性能分析器校准”。完成校准后QProfiler 会显CZ个对话框Q请单击“确定”按钮。如下面的示例所C?
要进行性能分析Q请q回至上面的W?9 步?
它用颜色编码来昄U程状态?
此图形显CZ应用E序没有响应的原因。标Cؓ AWT-EventQueue-0 的线E是 Swing 用来处理H口事g?a >事g分发U程 (Event Dispatch Thread, EDT)。在正常q行?Swing 应用E序中,EDT 的大部分旉处于{待状态而运行的旉却很,因ؓ它只有在分发事g时才会运行很短的一D|间。但是,如果应用E序中的事g处理E序未立卌回,则程序将停止响应Q就像在此示例中一栗?br />
EDT 为黄Ԍ应用E序创徏的名?"Our SwingWorker #1" 的线Eؓl色。由?EDT 不是用来执行耗时d的,因此Q按钮和其他E序控g仍保持响应的状态?
该图形可以帮助您判断E序在每个线E中所p的时间是否恰当。上q示例是代码修复后的CZQ因此,它显CZ EDT 在大部分旉中都处于{待状态的情ŞQ这正好是该U程应具有的行ؓ?br />
在本l习中,您学习了如何使用 Profiler 来启动应用程序,以及如何解释 Profiler 的线E信息图形,以此来跟t?Swing 应用E序中的性能问题?
在本l习中,您将学习如何使用 Profiler 来确定某个应用程序的Ҏ所p的时间?/p>
CPU 的性能问题通常与应用程序的特定功能有关。例如,在报告系l中Q某个报告的q行速度可能比其他报告慢。只分析应用E序中出现性能问题的部分,可以大大减少性能分析器生的开销。在本练习中Q您?NetBeans Profiler 来检?Web 应用E序?CPU 的用情c在l习 3 中,我们仍然使用该样?Web 应用E序来说明如何通过 Profiler 查找内存泄漏?/p>
注意Q下面的三个步骤仅适用?Milestone 8?/em>
Per
。等?IDE 为您昄适用的类列表。选择 Performance cR单几Z打开”按钮以打开其方法列表?
注意Q下面的两个步骤只适用?Profiler v5.0?/em>
剙H口昄了从Ҏ法开始的完整Ҏ调用囑Ş。底部窗口是重点描述的部分;它显CZ应用E序中的热点Q即执行旉最长的那些Ҏ?
在本l习中,您学习了如何使用性能分析器执行方法性能分析?/p>
作ؓl习 2 的后l练习,我们在本练习中学习如何解释某些性能分析器的囑Ş以监视应用程序创建对象的q程。下面将昄一个内存泄漏示例?
显C“选择性能分析d”对话框?
在左侧的囑Ş中,U色的阴影部分表C分配的 JVM 堆大。色的覆盖部分表示实际使用的堆I间大小。在上面的示例中Q上ơ更新所分配的堆大小已超q了 20 MB。其中,实际用来保存 Java 对象的堆大小略大?10 MB?/p>
右侧囑Ş昄?JVM 中的zdU程数?/p>
中间的图形显CZ两种重要的堆l计信息?
h意,在分配了 double[] 对象的方法中Q只有一个方法创Zh较大生成数值的 double[] 对象。该Ҏ?run()Q它位于h相应名称 demo.memoryleak.LeakThread 的类中?
在本l习中,您学习了如何使用性能分析器来监视应用E序创徏对象的过E。您q看C性能分析器在应用E序出现内存泄漏时所提供的各U类型的分析指数?/p>
(一)Windows下C/C++开发工具中QVC6使用较ؓ普遍Q因此这里先讲下VC6.0环境中集成pclint的步?
首先,
当然要下载YӞ正版软g?00?呢,CP所以只好网上找免费的拉。从
http://www.61ic.com/down/othe/pclint.rar
处可以下载到一?.0版本的pclint.
1.pclint.rar解压至c:\, q样lint文g׃与c:\pclint(安装目录)下了?br />2.c:\pclint\lnt 下的3个文件lib-w32.lntQenv-vc6.lntQco-msc60.lnt拯至c:\pclint下,
再在安装目录下创建std.lnt和options.lnt两个文gQ其中std.lnt的内容如?br />// contents of std.lnt
c:\pclint\co-msc60.lnt
c:\pclint\lib-w32.lnt
c:\pclint\options.lnt -si4 -sp4
-i"D:\Program Files;D:\Program Files\Microsoft Visual Studio\VC98\Include"
//end
其中-i后面的\径名为VC的安装\径和VC Include 文g路径Q根据自q修改便可?br />options.lnt 内容可ؓI,为定制内?以后需要时再添加?br />准备工作做完了,下一步就是要pclint集成到VC6中去Q先配置lint使之能对单个C或C++文gq行查?br />1.打开VC6Qtools--->customize-->tools 新徏一个名为pclint的项Q在下面填入
command: C:\pclint\lint-nt.exe
arguments: -u c:\pclint\std.lnt c:\pclint\env-vc6.lnt "$(FilePath)"
Use Output Window 打上?br />close 完成?q个在你VCH口tools菜单下应该多了一个pclint选项Q可以用它来q行lintE序Q对你的c/c++代码q行静态检查了?br />现在可以用个小E序试一下pclint?/font>
//test1.cpp#include <string.h>
class X
{
int *p;
public:
X()
{ p = new int[20]; }
void init()
{ memset( p, 20, 'a' ); }
~X()
{ delete p; }
};
~译q个文gQ看下你的编译器l你多少警告Q再q行下lintQ?可以自己Ҏ一下?br />我的机器上,VC产生0 errors 0 warnings, 而lintE序产生了如?条警告信?有些q是很有用处的提C,q里׃一一分析?
test.cpp(12): error 783: (Info -- Line does not end with new-line)
test.cpp(7): error 1732: (Info -- new in constructor for class 'X' which has no
assignment operator)
test.cpp(7): error 1733: (Info -- new in constructor for class 'X' which has no
copy constructor)
{ memset( p, 20, 'a' ); }
test.cpp(9): error 669: (Warning -- Possible data overrun for function
'memset(void *, int, unsigned int)', argument 3 (size=97) exceeds argument 1
(size=80) [Reference: test.cpp: lines 7, 9])
test.cpp(7): error 831: (Info -- Reference cited in prior message)
test.cpp(9): error 831: (Info -- Reference cited in prior message)
{ delete p; }
test.cpp(11): error 424: (Warning -- Inappropriate deallocation (delete) for
'new[]' data)
--- Wrap-up for Module: test.cpp
test.cpp(2): error 753: (Info -- local class 'X' (line 2, file test.cpp) not
referenced)
Tool returned code: 8
2.通常一个VC目中包含多个C或C++文gQ有旉要同时对q一pd的文件进行lint查,我们可以通过配置一个pclint_project来达到目的?br />和前面第一步中的方法基本一P不过q里我们需要用到unix中的find{命令来查找当前目录下的C和C++文gQ然后再它们送给lintE序处理Q所以得先从
http://www.weihenstephan.de/~syring/win32/UnxUtils.zip
下蝲UnxUtils.zip.
接着按下列步骤进行:
(i)解压UnxUtils.zip至c:\unix? 可以看到C:\unix\usr\local\wbin有很多unix下的命o,{下会用?br />(ii)打开VC6Qtools--->customize-->tools
新徏一个名为pclint_project的项Q只不过下面的commands和arguments内容不同?br />commands: C:\unix\usr\local\wbin\find.exe
arguments: $(FileDir) -name *.c -o -name *.cpp | C:\unix\usr\local\wbin\xargs
lint-nt -i"c:\unix\usr\local" -u c:\pclint\std.lnt
c:\pclint\env-vc6.lnt
(iii)Use Output Window打上勾,close退出。好了,q时VC
tools菜单下应该又多了一个pclint_project了Q你以后可以用它来对一个VC目q行lint查程序了.
(?SourceInsight中集成pclintE序的方?
Windowsq_下也有好多h都喜Ƣ用SourceInsight~辑C/C++E序Q如果将pclint集成到SourceInsight中,那就相当于给SourceInsight增加了一个C/C++~译?而且它的查更严格Q能发现一些编译器发现不了的问题,可以大大减少E序中潜伏的BUG。这L话,怿更多Z喜欢SourceInsightq个工具了?br />下面要地介绍下pclint集成到SourceInsight中的Ҏ
有了上面VC中集成pclint的经? 下面的事情就应该比较L了,
(a)打开你的SourceInsight, 选择Options-->Custom Commands-->Add, 输入pclint(当然名字可以随便).
(b) Run中输? c:\pclint\lint-nt -u c:\pclint\std.lnt c:\pclint\env-vc6.lnt %f
(c)Dir留空Q将Iconic Window, Capture Output, Parse Links in OutPut, File,then Line
四项前打上勾?br />(d)然后点右?Menu--->Menu-->View--><end of menu>, 右侧Insert, OK.
(e)此时在SourceInsight中的View菜单下多了个pclint选项Q可以用它来对单个C/C++文gq行静态检查?/font>
用类似的Ҏ可以配置对一个SourceInsight工程文g的lint查?br />(a)打开你的SourceInsight, 选择Options-->Custom Commands-->Add,
输入pclint_project(当然名字可以随便).
(b) Run中输? C:\unix\usr\local\wbin\find.exe %d -name *.c -o -name *.cpp |
C:\unix\usr\local\wbin\xargs lint-nt
-i"C:\unix\usr\local" -u c:\pclint\std.lnt c:\pclint\env-vc6.lnt
(c)Dir留空Q将Iconic Window, Capture Output, Parse Links in OutPut, File,then Line
四项前打上勾?br />(d)然后点右?Menu--->Menu-->View--><end of menu>, 右侧Insert, OK.
(e)此时在SourceInsight中的View菜单下多了个pclint_project选项Q可以用它来一个工E中的C/C++文gq行静态检查?/font>
本文主要对pclint集成到VC及SourceInsight环境中的ҎҎ本h安装和用心得做了较详细介绍Q希望对以前没用过pclint的朋友们能有所帮助Q不之处还请多指正Q?br />
而下面:
q里的string~译器就认识了,但是strcmp׃认识了呢Q ?br />
一般一个C++的老的带?h”扩展名的库文gQ比如iostream.hQ在新标准后的标准库中都有一个不带?h”扩展名的相对应Q区别除了后者的好多改进之外Q还有一点就是后者的东东都塞q了“std”名字空间中?
但唯独string特别?
问题在于C++要兼容C的标准库Q而C的标准库里碰巧也已经有一个名字叫做“string.h”的头文Ӟ包含一些常用的C字符串处理函敎ͼ比如g提到的strcmp?
q个头文件跟C++的stringcd点关pM没有Q所?lt;string>q<string.h>的“升U版本”,他们是毫无关pȝ两个头文件?
要达到楼ȝ目的Q比如同Ӟ
或者 ?br />
其中<cstring>是与C标准库的<string.h>相对应,但裹有std名字I间的版本?/font>
W谈Q来自高质量++Q?
C++标准库很大。非常大。难以置信的大。怎么个大法?q么说吧Q在C++标准中,关于标准库的规格说明占了密密麻麻300 多页Q这q不包括标准C 库,后者只?作ؓ参?Q老实_原文是用的q个词)包含在C++库中。当ӞqL大好Q但在现在的情况下,实大好Q因为大的库会包含大量的功能。标准库中的功能多Q开发自q应用E序时能借助的功能就多。C++库ƈ非提供了一切(很明昄是,没有提供q发和图形用h口的支持Q,但确实提供了很多。几乎Q何事你都可以求助于它。在归纳标准库中有些什么之前,需要介l一下它是如何组l的。因为标准库中东西如此之多,你(或象你一L其他什么hQ所选择的类名或函数名就很有可能和标准库中的某个名字相同。ؓ了避免这U情冉|造成的名字冲H,实际上标准库中的一切都被放在名字空间std 中(参见条款28Q。但q带来了一个新问题。无数现有的C++代码都依赖于使用了多q的伪标准库中的功能Q例如,声明?lt;iostream.h>Q?lt;complex.h>Q?lt;limits.h>{头文g中的功能。现有Y件没有针对用名字空间而进行设计,如果用std 来包装标准库D现有代码不能用,是一U可耻行为。(q种釜底抽薪的做法会让现有代码的E序员说出比"可? 更难听的话)慑于被激怒的E序员会产生的破坏力Q标准委员会军_为包装了std 的那部分标准库构件创建新的头文g名。生成新头文件的Ҏ仅仅是将现有C++头文件名中的.h LQ方法本w不重要Q正如最后生的l果不一致也q不重要一栗所?lt;iostream.h>变成?lt;iostream>Q?lt;complex.h>变成?lt;complex>Q等{。对于C 头文Ӟ采用同样的方法,但在每个名字前还要添加一个c。所以C ?lt;string.h>变成?lt;cstring>Q?lt;stdio.h>变成?lt;cstdio>Q等{。最后一ҎQ旧的C++头文件是官方所反对使用的(卻I明确列出不再支持Q,但旧的C 头文件则没有Q以保持对C 的兼Ҏ)。实际上Q编译器刉商不会停止对客L有Y件提供支持,所以可以预计,旧的C++头文件在未来几年内还是会被支持?br />所以,实际来说Q下面是C++头文件的现状Q?br />
旧的C++头文件名?lt;iostream.h>会l箋被支持,管它们不在官方标准中。这些头文g的内容不在名字空间std 中?br />新的C++头文件如<iostream>包含的基本功能和对应的旧头文件相同,但头文g的内容在名字I间std 中。(在标准化的过E中Q库中有些部分的l节被修改了Q所以旧头文件和新头文g中的实体不一定完全对应。)
标准C 头文件如<stdio.h>l箋被支持。头文g的内容不在std 中?br />hC 库功能的新C++头文件具有如<cstdio>q样的名字。它们提供的内容和相应的旧C 头文件相同,只是内容在std 中?br />所有这些初看有Ҏ,但不难习惯它。最大的挑战是把字符串头文g理清楚:
<string.h>是旧的C 头文Ӟ对应的是Zchar*的字W串处理函数Q?br /><cstring>是对应于旧C 头文件的std 版本Q?br /><string>是包装了std 的C++头文Ӟ对应的是新的string cR?/font>
如果能掌握这些(我相信你能)Q其余的也就Ҏ了?br />
int *fp(int a);//q里是错误的Q因为按照结合性和优先U来看就是先?)l合Q然后变成了一个返回整形指针的函数了,而不是函数指针,q一点尤光要注意!
函数指针的说明方法ؓ:
string s="";//Ansistring
String s="";//string两者是不同?/p>
|络是一个相互联l的大群体,因此要想加入到这个群体中来,׃能随心所Ԍȝ兴之所发。就好象一个国家或一个种族拥有自q语言Q大安必须通晓q凭借这U语a来对话一P怺联结的网l中各个节点也需要拥有共同的“语a”,依据它所定义的规则来控制数据的传递,q种语言便是大家l常听说?“协议”。协议是对网l中讑֤以何U方式交换信息的一pd规定的组合,它对信息交换的速率、传输代码、代码结构、传输控制步骤、出错控制等许多参数作出定义?
对网l始入门者来_UL复杂的协议常常让人头痛不巜y这些协议各起什么作用?它们之间又有什么联p?Z么有了A协议q需要补充B协议Q这些问题搞不清楚,往往成ؓq一步学习的障碍。其实这个问题应该这L解:是先有了各种不同语言的民族,后来随着C会的发展,才有了不同民族间交流的需求。网l也是这P最初h们在范围内建立|络Q只需要自׃一些简单的U定Q保证这一有限范围内的用户遵守可以了Q到后来|络规模来大Q才考虑到制定更严格的规章制度即协议Q而ؓ了实现多个不同网l的互联Q又会增加不新协议作ؓ补充Q或成长为统一的新标准?
数据在网l中由源传输到目的地Q需要一pd的加工处理,Z便于理解Q我们这里不妨打个比喅R如果我们把数据比做巧克力:我们可以把加工y克力的设备作为源Q而把消费者的手作为目的来看看会有什么样的传输过E。y克力厂通常会ؓ每块巧克力外边加上一层包装,然后q会若qy克力装入一个y克力盒,再把几个巧克力盒一赯入一个外包装Q运输公司还会把许多y克力装入一个集装箱Q到达消费者所在的城市后,又会p输商、批发商、零售商、消费者打开不同的包装层。不同层ơ的包装、解包装需要不同的规范和设备,计算机网l也同样有不同的装、传输层面,为此国际标准化组lISO?978 q提出“开攄l互q参考模型”,卌名的OSI(Open System Interconnection)七层模型Q它是我们后箋幅中要介绍的内容,q里先不展开?|络的协议就是用作这些不同的|络层的行ؓ规范的。网l在发展q程中Ş成了很多不同的协议族Q每一协议族都在网l的各层对应有相应的协议Q其中作为Internet规范的是ICP/IP协议族,q也是我们今天要讲的?
TCP/IP协议的定义以及层ơ、功?
什么是TCP/IP协议Q划为几层,各有什么功能?
TCP/IP协议族包含了很多功能各异的子协议。ؓ此我们也利用上文所q的分层的方式来剖析它的l构?font style="BACKGROUND-COLOR: #7fffd4">TCP/IP层次模型共分为四层:应用层、传输层、网l层、数据链路层?
TCP/IP|络协议
TCP/IP(Transmission Control Protocol/Internet ProtocolQ传输控制协?|间|协?是目前世界上应用最为广泛的协议Q它的流行与Internet的迅猛发展密切相关—TCP/IP最初是Z联网的原型ARPANET所设计的,目的是提供一整套方便实用、能应用于多U网l上的协议,事实证明TCP/IP做到了这一点,它ɾ|络互联变得ҎhQƈ且ɭ来多的网l加入其中,成ؓInternet的事实标准?
* 应用?/font>—应用层是所有用h面向的应用程序的l称。ICP/IP协议族在q一层面有着很多协议来支持不同的应用Q许多大家所熟悉的基于Internet的应用的实现q不开q些协议。如我们q行万维|(WWWQ访问用CHTTP协议、文件传输用FTP协议、电子邮件发送用SMTP、域名的解析?font style="BACKGROUND-COLOR: #7fffd4">DNS协议?q程d?font style="BACKGROUND-COLOR: #7fffd4">Telnet协议{等Q都是属于TCP/IP应用层的Q就用户而言Q看到的是由一个个软g所构筑的大多ؓ囑Ş化的操作界面Q而实际后台运行的便是上述协议?
* 传输?/font>—这一层的的功能主要是提供应用E序间的通信QTCP/IP协议族在q一层的协议?font style="BACKGROUND-COLOR: #7fffd4">TCP和UDP?
* |络?/font>—是TCP/IP协议族中非常关键的一层,主要定义了IP地址格式Q从而能够得不同应用类型的数据在Internet上通畅C输,IP协议是一个网l层协议?
* |络接口?/font>—这是TCP/IP软g的最低层Q负责接收IP数据包ƈ通过|络发送之Q或者从|络上接收物理Q抽出IP数据报,交给IP层?
1QTCP/UDP协议
TCP (Transmission Control Protocol)和UDP(User Datagram Protocol)协议属于传输层协议。其中TCP提供IP环境下的数据可靠传输Q它提供的服务包括数据流传送、可靠性、有效流控、全双工操作和多路复用。通过面向q接、端到端和可靠的数据包发送。通俗_它是事先为所发送的数据开辟出q接好的通道Q然后再q行数据发送;而UDP则不为IP提供可靠性、流控或差错恢复功能。一般来_TCP对应的是可靠性要求高的应用,而UDP对应的则是可靠性要求低、传输经的应用。TCP支持的应用协议主要有QTelnet、FTP、SMTP{;UDP支持的应用层协议主要有:NFSQ网l文件系l)、SNMPQ简单网l管理协议)、DNSQ主域名U系l)、TFTPQ通用文g传输协议Q等?
IP协议的定义、IP地址的分cd特点
什么是IP协议QIP地址如何表示Q分为几c,各有什么特点?
Z便于d和层ơ化地构造网l,IP地址被分为A、B、C、D、E五类Q商业应用中只用到A、B、C三类?
IP协议(Internet Protocol)又称互联|协议,是支持网间互q的数据报协议,它与TCP协议Q传输控制协议)一h成了TCP/IP协议族的核心。它提供|间q接的完善功能, 包括IP数据报规定互q网l范围内的IP地址格式?
Internet 上,Z实现q接C联网上的l点之间的通信Q必Mؓ每个l点Q入|的计算机)分配一个地址Qƈ且应当保证这个地址是全|唯一的,q便是IP地址?
目前的IP地址QIPv4QIPW?版本Q由32个二q制位表C,?位二q制Cؓ一个整敎ͼ中间由小数点间隔Q如159.226.41.98Q整个IP地址I间?l?位二q制敎ͼpCZ机所在的|络的地址Q类似部队的~号Q以及主机在该网l中的标识(如同士兵在该部队的编P共同l成?
Z便于d和层ơ化的构造网l,IP地址被分为A、B、C、D、E五类Q商业应用中只用到A、B、C三类?
* Acd址QAcd址的网l标识由W一l?位二q制数表C,|络中的L标识?l?位二q制敎ͼAcd址的特Ҏ|络标识的第一位二q制数取值必Mؓ?”。不隄出,Acd址允许?26个网D,每个|络大约允许?670万台LQ通常分配l拥有大量主机的|络Q如d|)?
* Bcd址QBcd址的网l标识由前两l?位二q制数表C,|络中的L标识占两l?位二q制敎ͼBcd址的特Ҏ|络标识的前两位二进制数取值必Mؓ?0”。Bcd址允许?6384个网D,每个|络允许?5533C机,适用于结Ҏ较多的网l(如区域网Q?
* Ccd址QCcd址的网l标识由?l?位二q制数表C,|络中主机标识占1l?位二q制敎ͼCcd址的特Ҏ|络标识的前3位二q制数取值必Mؓ?10”。具有Ccd址的网l允许有254C机,适用于结Ҏ较少的网l(如校园网Q?
Z便于记忆Q通常习惯采用4个十q制数来表示一个IP地址Q十q制C间采用句点?”予以分隔。这UIP地址的表C方法也被称为点分十q制法。如以这U方式表C,Acȝl的IP地址范围?.0.0.1Q?27.255.255.254QBcȝl的IP地址范围为:128.1.0.1Q?91.255.255.254QCcȝl的IP地址范围为:192.0.1.1Q?23.255.255.254?
׃|络地址紧张、主机地址相对q剩Q采取子|掩码的方式来指定网D号?
TCP/IP协议与低层的数据链\层和物理层无养Iq也是TCP/IP的重要特炏V正因ؓ如此 Q它能广泛地支持׃两层协议构成的物理网l结构。目前已使用TCP/IPq接成洲际网、全国网与跨地区|?/font>