亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
123下一頁
最近訪問板塊 發(fā)新帖
查看: 22284 | 回復(fù): 23
打印 上一主題 下一主題

[C++] 引用變量占用內(nèi)存空間嗎? [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2011-07-30 18:31 |只看該作者 |倒序?yàn)g覽
本帖最后由 go_hao 于 2011-07-30 18:33 編輯

引用變量占用內(nèi)存空間嗎?它的內(nèi)存地址就是“別引用的那個(gè)變量”呀,難道他自己不占內(nèi)存嗎?

#include "stdafx.h"
#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
        int val1=99;
        int &val2=val1;

        cout << "val1:" << val1 << " address:" << &val1 << endl;
        cout << "val2:" << val2 << " address:" << &val2 << endl;
        return 0;
}


引用變量,就是“被引用變量”的別名,但是,我不理解,它是否占內(nèi)存呢?
不可能不占內(nèi)存空間呀,但是如果占內(nèi)存的話,為何它的內(nèi)存地址,與被引用的變量是一個(gè)地址呢?

論壇徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52雙子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午馬
日期:2013-10-18 21:43:38
2 [報(bào)告]
發(fā)表于 2011-07-30 21:46 |只看該作者
編譯好后,引用就沒了

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2011-07-31 09:57 |只看該作者
引用就是別名,只是另外一個(gè)名字讓你好識(shí)別之類的吧,實(shí)際上不占內(nèi)存的。

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2011-07-31 09:58 |只看該作者
主要應(yīng)該是用于簡(jiǎn)化一些復(fù)雜的變量名之類的吧。

論壇徽章:
2
青銅圣斗士
日期:2015-11-26 06:15:59數(shù)據(jù)庫(kù)技術(shù)版塊每日發(fā)帖之星
日期:2016-07-24 06:20:00
5 [報(bào)告]
發(fā)表于 2011-07-31 13:00 |只看該作者
引用不占空間的說法是流傳很廣的誤會(huì)…… 造成該誤會(huì)的原因可能有:

1. 自動(dòng)變量?jī)?yōu)化

int是否占用空間?  這個(gè)不好說, 但int能sizeof, 能用 & 取到地址(非register)是肯定的。

  1. int f(int x, int y) {
  2.       int xx = x*x;
  3.       int yy = y*y;
  4.       int a = xx + yy;
  5.       return a;
  6. }
復(fù)制代碼
xx,yy,a是否占空間?  優(yōu)化開高了也許就不占了, 直接寄存器干活。
x/y是否占空間? 至少i386上 cdecl 調(diào)用約定是占的。


2. 無法取得變量本身的地址

sizeof得到的是被引用對(duì)象的大小, & 得到的是被引用對(duì)象的地址。
因?yàn)橐谜Z意的關(guān)系, 沒辦法"直接"獲得引用變量本身的大小與地址信息
可能也造成了該誤會(huì)……


類似Windows下的dll導(dǎo)入機(jī)制:

  1. __declspec(dllimport) double x;
復(fù)制代碼
實(shí)際上類似這樣的代碼

  1. extern double* __imp_x;
  2. #define x (*__imp_x);
復(fù)制代碼
通過x宏, 沒法取得 __imp_x 的大小與地址。
C++沒有規(guī)定引用如何實(shí)現(xiàn)。 但在i386上, cl/gcc/clang實(shí)現(xiàn)都類似這樣。


3. 繞過語法糖干擾

最簡(jiǎn)單的方法:

  1. struct X { double& d; };
  2. enum { size = sizeof(X) }; // 該平臺(tái)上引用大小

  3. double d;
  4. X x = { d };
  5. void* address = &x; // 引用變量的地址

  6. unsigned char representation[sizeof(X)];
  7. memcpy(representation, address, sizeof x); // 可查看引用變量的表示
復(fù)制代碼
其他還有很多方法阻止編譯器優(yōu)化, 比如參數(shù), 靜態(tài)變量…… 不過都比結(jié)構(gòu)體復(fù)雜。


4. 小結(jié)

C++ (印象中)沒有詳細(xì)描述引用變量的實(shí)現(xiàn)方式。
但在 i386(cl/gcc/clang) 下, 引用 —— 如同 int —— 是有大小的, 可以用 3 的方式得到
自動(dòng)變量的空間(無論是否是引用)都有可能被優(yōu)化。

論壇徽章:
2
天蝎座
日期:2014-03-28 10:18:052015年亞洲杯之烏茲別克斯坦
日期:2015-02-10 11:32:25
6 [報(bào)告]
發(fā)表于 2011-07-31 15:37 |只看該作者
不占吧,指針還得留著賦值,引用直接就是別名了

論壇徽章:
1
CU十二周年紀(jì)念徽章
日期:2013-10-24 15:41:34
7 [報(bào)告]
發(fā)表于 2011-07-31 21:47 |只看該作者
都有一個(gè)作用域吧。

論壇徽章:
3
15-16賽季CBA聯(lián)賽之山東
日期:2016-10-30 08:47:3015-16賽季CBA聯(lián)賽之佛山
日期:2016-12-17 00:06:31CU十四周年紀(jì)念徽章
日期:2017-12-03 01:04:02
8 [報(bào)告]
發(fā)表于 2011-08-02 11:57 |只看該作者
回復(fù) 5# OwnWaterloo


    你妹,很久沒見你上來了啊.

    以前看過幾集《銀他媽》,沒注意。最近追《銀他媽》TV動(dòng)畫,才發(fā)現(xiàn)你的頭像原來是神樂{:3_185:}

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2011-08-02 15:43 |只看該作者
聽說不占

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2011-08-02 16:40 |只看該作者
占吧。。。做為函數(shù)形參的時(shí)候。。。
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP