青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Error

C++博客 首頁 新隨筆 聯系 聚合 管理
  217 Posts :: 61 Stories :: 32 Comments :: 0 Trackbacks
// lambda_test.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <functional>
// 利用rtii觀察堆棧生命周期
class StackLifeTimeWatching
{
public:
StackLifeTimeWatching()
{
std::cout << __FUNCTION__ << std::endl;
}
~StackLifeTimeWatching()
{
std::cout << __FUNCTION__ << std::endl;
}
};
// 經驗: 保存lambda表達式的變量被銷毀后,該表達式對應的閉包會銷毀。應該保證閉包在lambda表達式變量的生命周期之內執行,否則程序執行結果不可預知!
// 1.理解lambda首先要理解函數對象,和閉包
// 2.理解必包的基礎上,理解lambda如何實現閉包
// 3.理解閉包以后,需要分析設置不同的capture的情況下分別是如何實現閉包
//   1)閉包意味著一個函數地址 + 一組封裝好的參數。
//   2)閉包可以被拷貝,但是每個閉包中的參數可以是不一樣的
// 4.理解函數對象和lambda的關系: lambda可以理解成函數,但是當lambda賦值給一個函數對象的時候,編譯器應該是把lambda構造成了一個閉包的function
//   1)根據匯編碼分析,lambda對象類似于函數指針(但是類型系統和函數指針是完全不同的概念,可以用decltype(lambda)來鑒定),本質和函數對象是不一樣的。
//   2)定義一個lambda表達式相當于定義一個函數(觀察會變碼,lambda表達式是沒有構造和析構的)
//   3)把函數指針賦值給一個std::function,和吧lambda賦值給一個std::function的效果是完全不一樣的。一個這是指針賦值操作,另一個則是完整的閉包。
//   4)經過代碼實際測試,lambda是鑒于函數指針和函數對象之間的一個玩意,它也是一個特殊的類型,這個具體只能看C++標準文檔了。
//   5)boost asio異步接口中的functor可能是利用了meta編程技巧,或者他本身每一次發起異步操作都會形成一個獨立的閉包,解決了函數對象和socket對象生命周期綁定的關系
//      應為如果是functor實現,宿主對象析構,一定會造成作為成員變量的functor銷毀,同時引起lambda閉包混亂(不僅閉包參數亂掉,閉包函數本身也呈現混亂)。
//      由此分析,閉包中的任何一行代碼都必須在閉包本身的聲明周期內執行。似乎可以理解成,lambda閉包是把lambda函數本身也當作一個特殊的參數來完成閉包封裝的。
//      通過會變碼觀察,在使用不同的lambda變量調用lambda表達式的時候,會在ecx寄存器壓入不同的值,然后會讀取一塊關聯的內存。
//   6)vc2015下的lambda永遠都是4字節,這應該是編譯器實現細節了,按說應該是隨著閉包內容的大小變化而變化。我猜測,這四個字節應該指向一個塊內存,里邊的數據是用來還原“lambda”函數執行棧的閉包
// 5.通俗的理解上述分析: lambda對象(變量)是一塊內存,內存里邊是lambda表達式本身的副本。當執行lambda表達式對象的時候,實際是執行對象對應的內存中的代碼,如果對象被析構了,對應的代碼也就是未知代碼。
void Test1();
void Test2();
int main()
{
Test2();
    return 0;
}
void Test2()
{
int n = 0;
auto lambda = [&]()->void
{
StackLifeTimeWatching stackWatching;
n = 1;
int j = 0;
int j1 = 0;
int j2 = 0;
int j3 = 0;
int j4 = 0;
int j5 = 0;
};
decltype(&lambda) pLambda0 = &lambda;
decltype(&lambda) pLambda = NULL;
int nSize = sizeof(lambda);
{
decltype(lambda) lambda_copy = lambda;
lambda_copy();
}
(*pLambda0)();  // 正常掉用
(*pLambda)();  // 調用后整個閉包混亂
}
void Test1()
{
StackLifeTimeWatching p();
int n = 0;
std::function<void()> func;
std::function<void()>* pFunc = new std::function<void()>;
{
//std::function<void()> func = [&]()->void
//{
// StackLifeTimeWatching stackWatching;
// n = 1;
//};
//func();
auto lambda = [&]()->void
{
StackLifeTimeWatching stackWatching;
n = 1;
};
lambda();
func = lambda;
auto lambda2 = [&]()->void
{
delete pFunc;
pFunc = NULL;
StackLifeTimeWatching stackWatching;
n = 1;
};
//decltype(lambda) lambda_copy = lambda2; 編譯錯誤,應為編譯器會把每一個lambda表達式當作一個獨立的類型,這是lambda不同于函數指針的地方,函數指針是根據參數來決定類型的
decltype(lambda) lambda_copy = lambda;
*pFunc = lambda2;
}
func();
(*pFunc)();
}
posted on 2017-03-22 22:41 Enic 閱讀(1856) 評論(0)  編輯 收藏 引用 所屬分類: C/C++技巧
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美在线啊v| 亚洲视频在线二区| 亚洲精品在线一区二区| 激情成人亚洲| 亚洲第一视频| 亚洲精品乱码久久久久久久久| 尤物网精品视频| 国产精品久久久久久一区二区三区| 久久久综合激的五月天| 久久中文字幕导航| 欧美亚洲视频在线看网址| 欧美三级网址| 亚洲午夜精品网| 亚洲美女av电影| 欧美日韩国产成人在线| 日韩视频一区二区三区在线播放| 牛牛国产精品| 久久综合久久久久88| 在线欧美三区| 亚洲国产成人91精品| 亚洲欧美日韩国产一区二区| 国产精品乱子乱xxxx| 亚洲欧美日韩国产成人精品影院| 一区二区日韩精品| 国产精品美女久久久浪潮软件| 亚洲欧美日韩国产中文 | 欧美激情黄色片| 久久人人爽人人爽| 亚洲精品在线免费| 亚洲网站在线看| 国产区精品视频| 免费成人av在线看| 欧美激情偷拍| 欧美一区二区免费| 久久综合色一综合色88| 亚洲美女色禁图| 国产精品99久久久久久白浆小说| 国产欧美日韩精品专区| 男女视频一区二区| 欧美日韩中字| 久久免费黄色| 欧美日韩a区| 久久久www免费人成黑人精品 | 欧美日韩伊人| 久久理论片午夜琪琪电影网| 六月婷婷一区| 亚洲欧美日韩国产成人| 久久久夜夜夜| 亚洲免费一区二区| 狼人社综合社区| 亚洲影视九九影院在线观看| 久久精品99久久香蕉国产色戒| 亚洲第一福利视频| 亚洲小少妇裸体bbw| 在线成人激情视频| 亚洲一区在线观看免费观看电影高清 | 国产午夜精品久久久久久久| 亚洲国产精品一区二区www| 久久九九热免费视频| 亚洲欧美国产日韩中文字幕 | 在线观看欧美成人| 国产精品国产三级国产普通话三级| 亚洲免费av电影| 欧美黄网免费在线观看| 久久久久久久一区| 欧美亚一区二区| 亚洲国产三级在线| 国产自产在线视频一区| 亚洲小说欧美另类社区| 亚洲日本中文字幕| 久久精品亚洲乱码伦伦中文 | 欧美日韩免费网站| 亚洲国产综合91精品麻豆| 中国成人在线视频| 亚洲一级特黄| 国产一区二区三区视频在线观看| 午夜视频一区在线观看| 午夜精品福利视频| 在线观看亚洲精品| 亚洲国产欧美在线人成| 欧美日韩一级片在线观看| 亚洲欧美日韩视频二区| 欧美一区中文字幕| 亚洲日韩第九十九页| 一本色道久久综合亚洲精品不卡 | 欧美性一区二区| 久久成人这里只有精品| 久久男人av资源网站| 日韩一级精品视频在线观看| 艳女tv在线观看国产一区| 国产日韩精品一区二区三区在线| 噜噜噜91成人网| 欧美日韩免费区域视频在线观看| 午夜日本精品| 蜜桃精品久久久久久久免费影院| 一二三四社区欧美黄| 亚洲欧美自拍偷拍| 亚洲精品乱码久久久久久久久| 亚洲精品日产精品乱码不卡| 国产亚洲精品成人av久久ww| 亚洲黄色高清| 国模叶桐国产精品一区| 99这里有精品| 亚洲第一黄色| 亚洲一区久久| 亚洲人体大胆视频| 欧美中日韩免费视频| 中文av字幕一区| 猛男gaygay欧美视频| 国产一区二区三区免费观看| 在线视频一区二区| 久久久久成人网| 尤物九九久久国产精品的分类| 免费一级欧美片在线播放| 亚洲国产视频一区| 亚洲主播在线播放| 国产亚洲成精品久久| 午夜日韩在线| 亚洲电影在线播放| 欧美主播一区二区三区美女 久久精品人| 亚洲一区在线看| 欧美承认网站| 夜夜嗨av色综合久久久综合网| 久久精品一区二区三区中文字幕 | 黄色国产精品| 午夜免费久久久久| 亚洲性夜色噜噜噜7777| 久久久久五月天| 久久人91精品久久久久久不卡 | 久久国产主播精品| 久久精品一区二区国产| 久久精品午夜| 国产日韩成人精品| 亚洲手机视频| 亚洲欧美视频| 国产精品日本欧美一区二区三区| 99精品免费视频| 99www免费人成精品| 免费久久99精品国产| 欧美福利电影网| 91久久综合亚洲鲁鲁五月天| 麻豆成人综合网| 亚洲高清视频一区二区| 亚洲伦理在线免费看| 欧美日韩1区2区| 亚洲综合好骚| 榴莲视频成人在线观看| 最新日韩在线| 欧美日韩精品三区| 亚洲性色视频| 久久久中精品2020中文| 在线视频国内自拍亚洲视频| 免费成人av| 一本色道久久综合| 午夜一区在线| 极品裸体白嫩激情啪啪国产精品| 久久综合激情| 亚洲精品自在在线观看| 亚洲欧美另类中文字幕| 国产亚洲欧洲| 免费在线亚洲| 亚洲色图在线视频| 鲁大师影院一区二区三区| 亚洲高清视频一区| 欧美日韩国产精品| 欧美一区二区三区免费看| 猫咪成人在线观看| 日韩午夜免费| 国产日韩欧美电影在线观看| 久久综合伊人77777蜜臀| 亚洲免费精彩视频| 久久精品国产v日韩v亚洲| 亚洲国产成人av| 国产精品成人免费| 麻豆精品91| 亚洲午夜久久久| 欧美99在线视频观看| 中文一区二区在线观看| 很黄很黄激情成人| 欧美色综合网| 狂野欧美激情性xxxx欧美| 一本一本a久久| 一区精品在线播放| 99视频+国产日韩欧美| 亚洲日本成人在线观看| 亚洲成人在线网站| 经典三级久久| 亚洲成色www8888| 一本一本久久| 蜜臀va亚洲va欧美va天堂| 亚洲欧美99| av成人免费在线观看| 亚洲国产高清一区| 国产日韩专区| 国产精品免费一区二区三区观看| 欧美freesex8一10精品| 欧美亚洲一级片| 在线一区免费观看| 亚洲精品孕妇| 欧美激情久久久久久|