目錄
C++ 性能剖析 (四):Inheritance 对性能的影响,剖析inheritance
介绍一下:材料间的结合键对材料性可以的影响
幕墙三项物理性可以实验
首頁 後端開發 php教程 C++ 性能剖析 (四):Inheritance 对性能的影响,剖析inheritance_PHP教程

C++ 性能剖析 (四):Inheritance 对性能的影响,剖析inheritance_PHP教程

Jul 13, 2016 am 10:19 AM
c++ 剖析 影響 效能

C++ 性能剖析 (四):Inheritance 对性能的影响,剖析inheritance

(这个editor今天有毛病,把我的format全搞乱了,抱歉!)

 

Inheritance 是OOP 的一个重要特征。虽然业界有许多同行不喜欢inheritance,但是正确地使用inheritance是一个应用层面和架构层面的重要设计决定。 大量使用inheritance,尤其在类似std container 中使用,会对程序性能产生何等影响呢?

从我个人的经验来看,constructor对创建具有深层inheritance链的class,有很大的影响。 如果应用容许,最好使用没有constructor的基类。下面举个例子:

struct __declspec(novtable) ITest1

{ virtual void AddRef() = 0;

    virtual void Release() = 0;

    virtual void DoIt(int x) = 0; };

class CTest: public ITest1

{

int ref;

public: inline CTest() { ref = 0; }

inline void AddRef() { ++ref; }

inline void Release() {--ref; }

inline void DoIt(int x) {ref *= x; }

inline void AddRef2() { ++ref; }

inline void Release2() {--ref; }

inline void DoIt2(int x) {ref *= x; }

static void TestPerf(int loop); };

这是个dummy程序,然而在COM中确是再常见不过。如果我们要大量创建并使用CTest,有经验的程序员应该看出,ITest1 完全不需要constructor。 根据C++ 说明书,ITest1因为有虚拟函数,属于“非简单构造类”,编译必须产生一个constructor,其唯一的目的是设置ITest1的vtbl (虚拟函数表)。

然而interface的唯一作用是被继承,所以其vtbl一定是被其继承类设置。编译在这种情况下没必要生成constructor。 微软在设计ATL时认识到这一点,推出自己的方案来躲避C++官方SPEC的缺陷:VC++提供了novtableclass modifier,告诉编译:我不需要你的constructor. 然而我在VS 2010中的测试结果却令人失望:

ITest1的constructor 仍然被生成了,只是它没有将vtbl赋值而已,这对增进基类构造的性能实为杯水车薪之举。 下面我们看看这个“毫无用处的constructor”对性能的影响。 我们权且拿出另一个不需要虚拟函数的ITestPOD (POD的意思是“数据而已”)来做比较:

struct ITest1POD

{ inline void AddRef() { }

inline void Release() { }

inline void DoIt(int x) { } };

ITestPOD当然不能完全作interface用(interface必须用虚拟函数),仅仅为了测试。然后,我们设计一个继承类,和上面的CTest功能完全一样:

class CTestPOD: public ITest1POD

{

int ref;

public: inline CTestPOD() { ref = 0; }

inline void AddRef() { ++ref; }

inline void Release() {--ref; }

inline void DoIt(int x) {ref *= x; }

};

我们的目的是用这个CTestPOD来和CTest作一番苹果与苹果的比较:

void CTest::TestPerf(int loop)

{

clock_t begin = clock();

for(int i = 0; i

{

CTestPOD testPOD; // line1

testPOD.AddRef();

testPOD.DoIt(0);

testPOD.Release();

}

clock_t end = clock();

printf("POD time: %f \n",double(end - begin) / CLOCKS_PER_SEC);

begin = clock();

for(int i = 0; i

{

CTest test; // line2

test.AddRef2();

test.DoIt2(0);

test.Release2();

}

end = clock();

printf("Interface time: %f \n",double(end - begin) / CLOCKS_PER_SEC);

}

上面的loop1loop2的唯一区别在line1和line2,为了避免用虚拟函数,我特意给CTest准备了AddRef2,DoIt2,Release2,三个同样的但却是非虚拟的函数,为的是遵循性能测试的一大原理:compare apple to apple。

我将loop设为10万,测试结果显示,loop2比loop1的速度低了20% 左右。从生成的代码来看,唯一的区别是CTest的constructor调用了编译自动生成的ITest1 的constructor。这个constructor没有任何作用,却白占了许多CPU周期。一个好的编译,应该是可以把这个constructor裁剪掉的,这个靠我们自己去搜索了。

总结

在应用inheritance时,除去基类里无用的constructor,对大量构造的object的性能来说,会有明显的影响。不幸的是,微软的__declspec(novtable) class modifier对解决这个问题没有提供任何帮助。在设计海量存储的object的应用中,我们应该尽量用POD来做其基类,避免上面CTest类那样明显的性能漏洞。

2014-9-3 西雅图

介绍一下:材料间的结合键对材料性可以的影响

在所有的固体中,原子靠键结合在一起。键使固体具有强度和相应的电学和热学性能。例如,强的键导致高熔点、高弹性模量、较短的原子间距和较低的热膨胀系数。
一、化学键
1. 离子键
离子键是由正负电荷的相互吸引造成的。例如,钠原子的价轨道中有一个电子,它很容易将外层电子释放而成为带正电的离子。同样,氯原子容易接受一个电子进入它们的价轨道直至达到八个电子而成为带负电的离子。既然带负电和带正电的材料之间总存在静电引力,那么在带不同电荷的相邻离子间就形成了键。离子键的特点是与正离子相邻的是负离子,与负离子相邻的是正离子,如NaCl晶体,见图2-1。
2 共价键
共价键是一种强吸引力的结合键。当两个相同原子或性质相近的原子接近时,价电子不会转移,原子间借共用电子对所产生的力而结合,形成共价键。共价键使原子间有很强的吸引力,这一点在金刚石中很明显,金刚石是自然界中最硬的材料,而且它完全是由碳原子组成。每个碳原子有四个价电子,这些价电子与邻近原子共用,形成完全由价电子对结合而成的三维点阵。这些三维点阵使金刚石具有很高的硬度和熔点。
3. 金属键
金属是由金属键结合而成的,它具有同非金属完全不同的特性。金属原子的外层电子少,容易失去。当金属原子相互靠近时,这些外层原子就脱离原子,成为自由电子,为整个金属所共有,自由电子在金属内部运动,形成电子气。这种由自由电子与金属正离子之间的结合方式称为金属键,见图2-2。4. 分子键
分子键又叫范德瓦尔斯键,是最弱的一种结合键。它是靠原子各自内部电子分布不均匀产生较弱的静电引力,称为范德瓦尔斯力,由这种分子力结合起来的键叫做分子键。
5. 氢键
另一种范德瓦尔斯力实际上是极性分子的一种特殊情况。C-H、O-H或N-H键端部暴露的质子是没有电子屏蔽的,所以,这个正电荷可以吸引相邻分子的价电子,于是形成了一种库仑型的键,称为氢键,氢键是所有范德瓦尔斯键中最强的。氢键最典型的例子是水,一个水分子中氢质子吸引相邻分子中氧的孤对电子,氢键使水成为所有低分子量物质中沸点最高的物质。
二、结合键对材料性能的影响
1. 金属材料
金属材料的结合键主要是金属键。由于自由电子的存在,当金属受到外加电场作用时,其内部的自由电子将沿电场方向作定向运动,形成电子流,所以金属具有良好的导电性;金属除依靠正离子的振动传递热能外,自由电子的运动也能传递热能,所以金属的导热性好;随着金属温度的升高,正离子的热振动加剧,使自由电子的定向运动阻力增加,电阻升高,所以金属具有正的电阻温度系数;当金属的两部分发生相对位移时,金属的正离子仍然保持金属键,所以具有良好的变形能力;自由电子可以吸收光的能量,因而金属不透明;而所吸收的能量在电子回复到原来状态时产生辐射,使金属具有光泽。
金属中也有共价键(如灰锡)和离子键(如金属间化合物Mg3Sb2)。
2. 陶瓷材料
简单说来,陶瓷材料是包含金属和非金属元素的化合物,其结合键主要是离子键和共价键,大多数是离子键。离子键赋予陶瓷材料相当高的稳定性,所以陶瓷材料通常具有极高的熔点和硬度,但同时陶瓷材料的脆性也很大。
3. 高分子材料
高分子材料的结合键是共价键、氢键和分子键。其中,组成分子的结合键是共价键和氢键,而分子间的结合键是范德瓦尔斯键。尽管范德瓦尔斯键较弱,但由于高分子材料的分子很大,所以分子间的作用力也相应较大,这使得高分子材料具有很好的力学性能。
三、晶体与非晶体
在研究了结合键后,我们下一步的任务就是从原子或分子的排列方式上考虑材......余下全文>>
C++ 性能剖析 (四):Inheritance 对性能的影响,剖析inheritance_PHP教程
 

幕墙三项物理性可以实验

玻璃幕墙新规范、工程检验标准的

探讨和介绍

山东省建筑科学研究院(山东省建设机械质量监督检测中心)

李 承 伟

山东省建设机械质量监督检测中心作为我省的专职建筑幕墙检测单位,同时也作为国家工业产品生产许可证指定检测单位,近年来,对我省建筑幕墙工程进行了长期的测试和跟踪调查,初步掌握了我省建筑幕墙工程制造质量和施工水平的第一手资料。对比国内先进企业的技术水平,我省幕墙企业不仅在生产技术水平上存在一定的差距,同时,在对建筑幕墙的技术设计和施工手段上也存在一定的距离,重点反映在对规范的理解和贯彻上存在较大的差距。下面,就针对建筑幕墙的设计、计算及对规范的理解等方面,谈一下我们的看法。

一、《玻璃幕墙工程技术规范》JGJ102-2003修订内容概述

《玻璃幕墙工程技术规范》JGJ102-2003自2004年1月1日起实施,原行业标准《玻璃幕墙工程技术规范》JGJ102-96同时废止。JGJ102-2003修订内容较大,不仅增加了强制性条款、而且还增加了全玻幕墙及点支承幕墙内容、对其他内容也进行了较大的修订。

(一)增加的强制性条款:

1、硅酮结构密封胶在隐框和半隐框玻璃幕墙中使用,其玻璃与铝型材的粘结必须采用中型硅酮结构密封胶。

硅酮结构密封胶使用前,应经国家认可的检测机构进行与其相接触材料的相容性和剥离粘结性试验,并应对邵氏硬度、标准状态下拉伸粘结性能进行复验。检验不合格的产品不得使用。进口硅酮结构密封胶应具有商检报告。硅酮结构密封胶和硅酮建筑密封胶必须在有效期内使用。

硅酮结构密封胶应根据不同的受力情况进行承载力极限状态验算。

除全玻幕墙外,不应在现场打注硅酮结构密封胶。

2、结构件应按规定验算承载力和挠度并达到规范要求。

立柱主要受力部位铝型材截面开口部位的厚度不应小于3.0mm,闭口部位的厚度不应小于2.5mm;型材孔壁与螺钉之间直接采用螺纹受力连接时,其局部厚度尚不应小于螺钉的公称直径;钢型材截面主要受力部位的厚度不应小于3.0mm。

横梁主要受力部位铝合金型材的厚度不应小于2.0mm;当横梁跨度大于1.2 m时,其截面主要受力部位的厚度不应小于2.5mm。型材孔壁与螺钉之间直接采用螺纹受力连接时,其局部截面厚度不应小于螺钉的公称直径。钢型材截面主要受力部位的厚度不应小于2.5mm。

3、人员流动密度大、青少年或幼儿活动的公共场所以及使用中容易受到撞击的部位,其玻璃幕墙应采用安全玻璃;对使用中容易受到撞击的部位,尚应设置明显的警示标志。

(二)全玻幕墙的主要内容:

面板玻璃的厚度不宜小于10mm,当面板玻璃为夹层玻璃时,其单片厚度不应小于8 mm。

玻璃肋的截面厚度不应小于12mm,截面高度不应小于100mm。而且,该条为强制性条款。

在风荷载标准值作用下,玻璃肋的挠度限值宜取其计算跨度的1/200。

采用浮头式连接件的幕墙玻璃厚度不应小于6 mm;采用沉头式连接件的幕墙玻璃厚度不应小于8 mm。玻璃之间的空隙宽度不应小于10 mm,且应采用硅酮建筑密封胶嵌缝。该部分为强制性条款。

点支承玻璃幕墙的支承结构宜单独进行计算。

无论单根型钢或钢管作为支承结构、采用桁架或空腹桁架作为支承结构,在风荷载标准值作用下,其挠度极限宜取其跨度的1/250。

张拉杆索体系应在正反两个方向上形成承受风荷载或地震作用的稳定结构体系,连接件、受压杆或拉杆宜采用不锈钢材料,杆件直径不宜小于10mm,拉索钢绞线直径不宜小于8 mm。拉杆不宜采用焊接,拉索不应采用焊接。在风荷载标准值作用下,其挠度极限宜取其跨度......余下全文>>
 

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/873922.htmlTechArticleC++ 性能剖析 (四):Inheritance 对性能的影响,剖析inheritance (这个editor今天有毛病,把我的format全搞乱了,抱歉!) Inheritance 是OOP 的一个...
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

C#與C:歷史,進化和未來前景 C#與C:歷史,進化和未來前景 Apr 19, 2025 am 12:07 AM

C#和C 的歷史與演變各有特色,未來前景也不同。 1.C 由BjarneStroustrup在1983年發明,旨在將面向對象編程引入C語言,其演變歷程包括多次標準化,如C 11引入auto關鍵字和lambda表達式,C 20引入概念和協程,未來將專注於性能和系統級編程。 2.C#由微軟在2000年發布,結合C 和Java的優點,其演變注重簡潔性和生產力,如C#2.0引入泛型,C#5.0引入異步編程,未來將專注於開發者的生產力和雲計算。

Golang和C:並發與原始速度 Golang和C:並發與原始速度 Apr 21, 2025 am 12:16 AM

Golang在並發性上優於C ,而C 在原始速度上優於Golang。 1)Golang通過goroutine和channel實現高效並發,適合處理大量並發任務。 2)C 通過編譯器優化和標準庫,提供接近硬件的高性能,適合需要極致優化的應用。

vscode在哪寫代碼 vscode在哪寫代碼 Apr 15, 2025 pm 09:54 PM

在 Visual Studio Code(VSCode)中編寫代碼簡單易行,只需安裝 VSCode、創建項目、選擇語言、創建文件、編寫代碼、保存並運行即可。 VSCode 的優點包括跨平台、免費開源、強大功能、擴展豐富,以及輕量快速。

表演競賽:Golang vs.C 表演競賽:Golang vs.C Apr 16, 2025 am 12:07 AM

Golang和C 在性能競賽中的表現各有優勢:1)Golang適合高並發和快速開發,2)C 提供更高性能和細粒度控制。選擇應基於項目需求和團隊技術棧。

vscode怎麼在終端運行程序 vscode怎麼在終端運行程序 Apr 15, 2025 pm 06:42 PM

在 VS Code 中,可以通過以下步驟在終端運行程序:準備代碼和打開集成終端確保代碼目錄與終端工作目錄一致根據編程語言選擇運行命令(如 Python 的 python your_file_name.py)檢查是否成功運行並解決錯誤利用調試器提升調試效率

Golang和C:性能的權衡 Golang和C:性能的權衡 Apr 17, 2025 am 12:18 AM

Golang和C 在性能上的差異主要體現在內存管理、編譯優化和運行時效率等方面。 1)Golang的垃圾回收機制方便但可能影響性能,2)C 的手動內存管理和編譯器優化在遞歸計算中表現更為高效。

Python與C:學習曲線和易用性 Python與C:學習曲線和易用性 Apr 19, 2025 am 12:20 AM

Python更易學且易用,C 則更強大但複雜。 1.Python語法簡潔,適合初學者,動態類型和自動內存管理使其易用,但可能導致運行時錯誤。 2.C 提供低級控制和高級特性,適合高性能應用,但學習門檻高,需手動管理內存和類型安全。

在 visual studio code 中使用 c 嗎 在 visual studio code 中使用 c 嗎 Apr 15, 2025 pm 08:03 PM

在 VS Code 中編寫 C 語言不僅可行,而且高效優雅。關鍵在於安裝優秀的 C/C 擴展,它提供代碼補全、語法高亮和調試等功能。 VS Code 的調試功能可幫助你快速定位 bug,而 printf 輸出是老式但有效的調試方法。此外,動態內存分配時應檢查返回值並釋放內存以防止內存洩漏,調試這些問題在 VS Code 中很方便。雖然 VS Code 無法直接幫助進行性能優化,但它提供了一個良好的開發環境,便於分析代碼性能。良好的編程習慣、可讀性和可維護性也至關重要。總之,VS Code 是一

See all articles