十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
本篇內(nèi)容主要講解“C++寄存器怎么優(yōu)化”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“C++寄存器怎么優(yōu)化”吧!
創(chuàng)新互聯(lián)專注于煙臺網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供煙臺營銷型網(wǎng)站建設(shè),煙臺網(wǎng)站制作、煙臺網(wǎng)頁設(shè)計、煙臺網(wǎng)站官網(wǎng)定制、微信小程序開發(fā)服務(wù),打造煙臺網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供煙臺網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
在C++里面有個有趣的現(xiàn)象,先看代碼
#include
using namespace std;
int main()
{
int const tmp = 100; //定義常量tmp tmp不能修改
int const* p = &tmp; //不能通過指針修改指向的值
int* const q = const_cast(p); //去常屬性 可以通過指針修改指向的內(nèi)容
*q = 200;
cout << tmp << " " << *p << " " << *q << endl; //打印變量的值
cout << &tmp << endl << p << endl << q << endl; //打印變量地址
return 0;
}
打印結(jié)果
100 200 200
0086F9D0
0086F9D0
0086F9D0
what? 什么,地址一樣,打印結(jié)果不一樣,不是應(yīng)該一樣的嗎?。?!
既然標(biāo)題是 C++ 寄存器優(yōu)化,那么就要從寄存器出發(fā)去考慮。
「當(dāng)定義常量時」
int const tmp = 100; //定義常量tmp tmp不能修改
我們就相當(dāng)于和編譯器約定好了,我們不會去修改 tmp 的值,這個時候編譯器就會做一個優(yōu)化,將 tmp 的值,放到寄存器里面,然后讀取 tmp 時直接在寄存器里面讀取,加快讀取速度。
這個時候我們有去常屬性 const_cast ,通過變量 q 修改 tmp 在內(nèi)存中的值
int* const q = const_cast(p); //去常屬性 可以通過指針修改指向的內(nèi)容
*q = 200;
在打印結(jié)果時,tmp 讀取的是「寄存器」的值,p ,q讀取的是「內(nèi)存」的值
cout << tmp << " " << *p << " " << *q << endl; //打印變量的值
上面這種優(yōu)化肯定程序員所不愿意看到的,所以C++有一個關(guān)鍵字來解決這種不期望的優(yōu)化問題,那就是 volatile ,英文翻譯:「易變的; 無定性的」; 其實就是告訴編譯器這個關(guān)鍵字修飾的變量不安全,你要到內(nèi)存里面去操作,不要直接從寄存器取值。
volatile int const tmp2 = 100;
volatile int const* pm = &tmp2; //不能通過指針修改指向的值
int* const qm = const_cast(pm); //q本身只讀 指向讀寫
*qm = 200;
cout << tmp2 << " " << *pm << " " << *qm << endl;
cout << (void*)&tmp2 << endl << (void*)pm << endl << qm << endl;
打印結(jié)果:
200 200 200
007CFDDC
007CFDDC
007CFDDC 到此,相信大家對“C++寄存器怎么優(yōu)化”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!