(這個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++提供了novtable的class 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 < loop; ++i) //loop1
{
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 < loop; ++i) //loop2
{
CTest test; // line2
test.AddRef2();
test.DoIt2(0);
test.Release2();
}
end = clock();
printf("Interface time: %f \n",double(end - begin) / CLOCKS_PER_SEC);
}
上面的loop1和loop2的唯一區別在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. 高分子材料
高分子材料的結合鍵是共價鍵、氫鍵和分子鍵。其中,組成分子的結合鍵是共價鍵和氫鍵,而分子間的結合鍵是范德瓦爾斯鍵。盡管范德瓦爾斯鍵較弱,但由於高分子材料的分子很大,所以分子間的作用力也相應較大,這使得高分子材料具有很好的力學性能。
三、晶體與非晶體
在研究了結合鍵後,我們下一步的任務就是從原子或分子的排列方式上考慮材......余下全文>>
玻璃幕牆新規范、工程檢驗標准的
探討和介紹
山東省建築科學研究院(山東省建設機械質量監督檢測中心)
李 承 偉
山東省建設機械質量監督檢測中心作為我省的專職建築幕牆檢測單位,同時也作為國家工業產品生產許可證指定檢測單位,近年來,對我省建築幕牆工程進行了長期的測試和跟蹤調查,初步掌握了我省建築幕牆工程制造質量和施工水平的第一手資料。對比國內先進企業的技術水平,我省幕牆企業不僅在生產技術水平上存在一定的差距,同時,在對建築幕牆的技術設計和施工手段上也存在一定的距離,重點反映在對規范的理解和貫徹上存在較大的差距。下面,就針對建築幕牆的設計、計算及對規范的理解等方面,談一下我們的看法。
一、《玻璃幕牆工程技術規范》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。拉桿不宜采用焊接,拉索不應采用焊接。在風荷載標准值作用下,其撓度極限宜取其跨度......余下全文>>