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

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>
            免费在线日韩av| 亚洲无亚洲人成网站77777| 日韩一级二级三级| 亚洲精品欧洲| 中文高清一区| 先锋影音国产一区| 久久久国产视频91| 欧美成人资源网| 亚洲精品国产精品国产自| 亚洲黄一区二区三区| 日韩午夜电影在线观看| 在线播放亚洲| 欧美激情一区二区三区| 国产精品播放| 极品尤物一区二区三区| 9l国产精品久久久久麻豆| 亚洲午夜精品一区二区三区他趣 | 亚洲欧美另类在线| 久久精品99无色码中文字幕| 麻豆精品在线视频| 国产精品亚洲综合天堂夜夜| 狠狠做深爱婷婷久久综合一区 | 亚洲第一狼人社区| 亚洲天堂偷拍| 欧美成人午夜激情视频| 在线视频亚洲一区| 蜜桃久久精品乱码一区二区| 国产精品va| 99精品国产福利在线观看免费| 欧美一级免费视频| 亚洲乱码国产乱码精品精98午夜 | 国产精品高潮呻吟| 亚洲丰满在线| 久久久亚洲午夜电影| 亚洲美女免费视频| 麻豆国产精品va在线观看不卡| 国产精品美女一区二区| 日韩一级大片在线| 欧美激情第3页| 久久精品视频免费观看| 国产欧美日韩在线 | 欧美在线播放| 亚洲日本久久| 久久亚洲一区二区| 国产精品自在在线| 亚洲综合色噜噜狠狠| 91久久综合| 蜜桃av噜噜一区| 亚洲国产精品成人综合色在线婷婷| 午夜精品视频在线| 日韩午夜电影在线观看| 欧美日韩精品久久久| 亚洲美女91| 亚洲精品1区2区| 欧美精品xxxxbbbb| 一本久久青青| 亚洲裸体视频| 国产精品v欧美精品v日本精品动漫| 亚洲精品在线观看免费| 欧美大片在线看| 免费av成人在线| 9人人澡人人爽人人精品| 国产精品99久久久久久久vr| 欧美一区免费| 国产亚洲欧美日韩日本| 久久激情五月婷婷| 欧美中在线观看| 国内精品福利| 可以看av的网站久久看| 欧美一站二站| 在线观看国产一区二区| 亚洲国产aⅴ天堂久久| 欧美14一18处毛片| 一本一本久久a久久精品综合妖精| 日韩一级大片在线| 欧美日韩日本视频| 午夜欧美视频| 性欧美办公室18xxxxhd| 好吊色欧美一区二区三区四区 | 一本色道久久综合亚洲精品不| 欧美精品123区| 亚洲色图制服丝袜| 欧美一区二区网站| 亚洲国产一区二区三区a毛片 | 午夜欧美视频| 久久狠狠久久综合桃花| 亚洲电影av在线| 日韩一级免费| 女人色偷偷aa久久天堂| 国产一区二区三区在线观看视频 | 午夜亚洲性色福利视频| 在线播放亚洲一区| 日韩午夜在线视频| 国产日韩欧美高清| 免费成人在线视频网站| 欧美精品在线一区| 亚洲午夜电影在线观看| 久久精品一区二区三区中文字幕| 亚洲国产视频一区| 亚洲欧洲偷拍精品| 国产精品一区二区男女羞羞无遮挡 | 亚洲免费一级电影| 久久久噜噜噜久久人人看| 日韩亚洲精品视频| 性欧美1819性猛交| 亚洲一区二区伦理| 欧美成人r级一区二区三区| aa级大片欧美三级| 国产精品久久久| 91久久精品国产91性色tv| 亚洲国产高清自拍| 国产精品久久久久999| 亚洲国产精品va在线观看黑人| 欧美激情第三页| 欧美影院一区| 欧美日韩一区在线播放| 男女激情久久| 国产午夜精品理论片a级大结局| 亚洲激情视频网| 国产婷婷色一区二区三区| 亚洲精选久久| 亚洲韩国日本中文字幕| 午夜亚洲伦理| 亚洲一区二区三区免费观看 | 国产综合视频| 99riav1国产精品视频| 在线看欧美日韩| 欧美在线观看你懂的| 亚洲天堂网站在线观看视频| 欧美成人午夜激情| 美国成人毛片| 激情偷拍久久| 欧美专区日韩专区| 久久精品国产亚洲一区二区| 国产精品入口| 亚洲一区二区三区视频播放| 在线一区观看| 欧美日韩日日骚| 99精品国产热久久91蜜凸| 一本久久青青| 国产精品每日更新| 亚洲校园激情| 欧美中文字幕精品| 国产午夜精品久久久久久免费视| 亚洲欧美日韩天堂一区二区| 欧美一区二区在线| 国产欧美日韩在线视频| 欧美一区二区免费| 久久久国产精品一区| 在线精品观看| 欧美成人中文| 一区二区高清视频| 小处雏高清一区二区三区| 国产精品一区在线观看| 久久精品国产亚洲aⅴ| 国产精品豆花视频| 亚洲影视在线| 麻豆av一区二区三区| 在线观看视频一区二区| 久久综合久久综合久久| 亚洲成色www久久网站| 日韩亚洲一区二区| 国产精品成人一区二区艾草| 亚洲欧美日韩成人| 欧美成人综合一区| 亚洲视频精品| 国产真实精品久久二三区| 欧美69wwwcom| 亚洲视频在线观看视频| 久久久国产视频91| 91久久久亚洲精品| 国产精品国产三级国产专区53| 亚洲主播在线观看| 欧美激情a∨在线视频播放| 国产精品亚洲产品| 1024成人网色www| 欧美日韩高清在线观看| 亚洲淫性视频| 久久国产精品99国产精| 最近看过的日韩成人| 欧美日韩综合久久| 久久久免费精品| 亚洲精品老司机| 久久精品国产精品 | 免费永久网站黄欧美| 亚洲一区自拍| 亚洲国产成人tv| 久久精品国产96久久久香蕉| 亚洲精品在线视频观看| 国户精品久久久久久久久久久不卡 | 日韩视频免费在线观看| 制服丝袜亚洲播放| 欧美成人视屏| 亚洲欧美视频| 亚洲欧洲精品一区二区| 欧美激情视频一区二区三区免费| 亚洲视频在线一区观看| 在线看片成人| 国产精品主播| 国产精品成人一区二区三区夜夜夜 |