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

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亚洲v综合ⅴ国产v| 久久精品视频va| 欧美在线网址| 欧美一区日韩一区| 亚洲欧美激情精品一区二区| 亚洲免费黄色| 欧美亚洲一区在线| 久久香蕉精品| 欧美日本免费一区二区三区| 欧美日韩大片一区二区三区| 国产精品第十页| 在线不卡亚洲| 久久天天综合| 欧美国产一区二区三区激情无套| 久久夜色精品亚洲噜噜国产mv| 欧美激情国产日韩精品一区18| 欧美黄色片免费观看| 欧美午夜精彩| 亚洲人体大胆视频| 久久精品视频va| 亚洲国产精品久久久久婷婷884| 亚洲国产欧美一区二区三区丁香婷| 一本大道久久a久久精二百| 欧美一区二区三区啪啪 | 一区二区三区无毛| 亚洲乱码日产精品bd| 久久精品国产综合精品| 亚洲天堂av在线免费| 欧美日韩国产91| 亚洲一区二区成人| 亚洲日本中文字幕| 国产日韩欧美在线| 欧美a级一区| 亚洲电影免费观看高清| 亚洲国产欧美一区二区三区同亚洲 | 亚洲尤物视频网| 黄色一区三区| 在线综合视频| 一本久久综合亚洲鲁鲁五月天| 亚洲精品视频啊美女在线直播| 国产精品免费观看视频| 国产精品一区在线播放| 欧美一区影院| 女生裸体视频一区二区三区| 国产日韩av一区二区| 欧美一区亚洲| 在线视频你懂得一区| 欧美成人xxx| 有码中文亚洲精品| 西瓜成人精品人成网站| 亚洲日韩中文字幕在线播放| 久久综合电影| 一本色道久久| 亚洲精品国久久99热| 久久亚洲精品一区二区| 国产香蕉97碰碰久久人人| 久久不射中文字幕| 免费不卡在线观看| 亚洲免费观看高清在线观看| 久久婷婷国产麻豆91天堂| 久久夜色精品亚洲噜噜国产mv | 亚洲综合国产| 国产午夜精品福利| 国产精品一区二区久久久| 亚洲欧美日韩在线| 久久久久久久97| 中日韩视频在线观看| 久久精品国产99精品国产亚洲性色| 亚洲高清免费在线| 欧美大成色www永久网站婷| 欧美一区二粉嫩精品国产一线天| 亚洲黄网站在线观看| 裸体女人亚洲精品一区| 亚洲高清三级视频| 亚洲久久一区二区| 国产精品久久久久久久久久免费看 | 欧美激情在线有限公司| 欧美成人中文| 正在播放亚洲一区| 亚洲一级二级| 在线成人国产| 亚洲区在线播放| 国产精品美女www爽爽爽视频| 欧美一区二区视频观看视频| 久久久久久久一区二区三区| 亚洲卡通欧美制服中文| 亚洲小说欧美另类社区| 好吊色欧美一区二区三区四区| 欧美国产日本韩| 国产精品久久久91| 嫩草国产精品入口| 欧美无乱码久久久免费午夜一区 | 日韩视频一区二区| 国产日韩欧美在线播放| 亚洲国产精品999| 国产女主播一区二区三区| 欧美大片在线观看一区二区| 国产精品成人免费视频| 欧美成人嫩草网站| 国产欧美1区2区3区| 亚洲精品乱码久久久久久久久| 国产欧美日韩在线| 日韩午夜高潮| 亚洲国产人成综合网站| 亚洲欧美变态国产另类| 99视频+国产日韩欧美| 久久国产日本精品| 亚洲免费在线播放| 欧美精品123区| 嫩草国产精品入口| 国产一区二区三区精品久久久| 亚洲美女在线看| 亚洲精品国产精品国自产观看浪潮| 亚洲欧美日韩一区二区三区在线观看| 亚洲日本中文字幕| 久久综合九色欧美综合狠狠| 久久精品123| 国产精品日日摸夜夜添夜夜av| 亚洲精品国产精品国自产在线| 韩国美女久久| 欧美在线亚洲在线| 久久国产精品网站| 国产欧美日韩视频一区二区| 99精品国产热久久91蜜凸| 亚洲伦理中文字幕| 欧美韩日精品| 亚洲精品在线看| 一本色道综合亚洲| 欧美日韩精选| 制服丝袜激情欧洲亚洲| 一本色道久久综合亚洲精品不| 欧美aⅴ一区二区三区视频| 嫩草国产精品入口| 亚洲国产欧美日韩精品| 美女视频黄免费的久久| 欧美激情视频一区二区三区在线播放 | 亚洲国产成人av| 久久久久久久网| 美女精品在线观看| 在线播放亚洲| 久久夜色精品亚洲噜噜国产mv| 久久亚洲国产成人| 亚洲成色777777在线观看影院| 老司机精品视频一区二区三区| 欧美高清在线| av不卡免费看| 国产精品久久久久久久久免费樱桃 | 欧美日韩国产123区| 日韩视频在线观看免费| 亚洲自拍偷拍视频| 国产综合精品| 欧美好骚综合网| 夜夜嗨av色一区二区不卡| 亚洲自拍偷拍网址| 好吊视频一区二区三区四区| 久久青青草综合| 亚洲精品一区在线观看香蕉| 亚洲免费在线观看| 激情av一区二区| 欧美日韩国语| 久久国产精品亚洲va麻豆| 亚洲国产一区二区精品专区| 亚洲午夜免费福利视频| 国产日韩欧美综合一区| 欧美大片免费看| 午夜电影亚洲| 亚洲激情网站| 久久精品二区三区| 亚洲精品日韩精品| 国产曰批免费观看久久久| 欧美日韩激情网| 久久精品在线观看| 999在线观看精品免费不卡网站| 久久激情视频久久| 9l视频自拍蝌蚪9l视频成人| 国产在线欧美日韩| 国产精品二区二区三区| 蜜桃伊人久久| 午夜精品久久久久久久久久久久久 | 亚洲精品在线观| 国产日韩欧美制服另类| 欧美日韩第一区日日骚| 久久久久久有精品国产| 亚洲视频一起| 亚洲欧洲另类国产综合| 久久精品在线播放| 亚洲欧美日韩国产成人精品影院| 91久久精品国产91性色tv| 欧美sm极限捆绑bd| 亚洲欧美日本国产有色| 亚洲精品影院| 一区二区三区在线免费播放| 国产精品成人一区| 欧美日韩国语| 欧美精品免费在线| 另类尿喷潮videofree| 久久精品夜夜夜夜久久|