精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

為 Python 寫一個(gè) C++ 擴(kuò)展模塊

開發(fā) 后端
在本文中,我將向你展示如何編寫一個(gè) C++ 擴(kuò)展模塊。使用 C++ 而不是 C,因?yàn)榇蠖鄶?shù)編譯器通常都能理解這兩種語(yǔ)言。

使用 C 擴(kuò)展為 Python 提供特定功能。

在前一篇文章中,我介紹了 ??六個(gè) Python 解釋器??。在大多數(shù)系統(tǒng)上,CPython 是默認(rèn)的解釋器,而且根據(jù)民意調(diào)查顯示,它還是最流行的解釋器。Cpython 的獨(dú)有功能是使用擴(kuò)展 API 用 C 語(yǔ)言編寫 Python 模塊。用 C 語(yǔ)言編寫 Python 模塊允許你將計(jì)算密集型代碼轉(zhuǎn)移到 C,同時(shí)保留 Python 的易用性。

在本文中,我將向你展示如何編寫一個(gè) C++ 擴(kuò)展模塊。使用 C++ 而不是 C,因?yàn)榇蠖鄶?shù)編譯器通常都能理解這兩種語(yǔ)言。我必須提前說(shuō)明缺點(diǎn):以這種方式構(gòu)建的 Python 模塊不能移植到其他解釋器中。它們只與 CPython 解釋器配合工作。因此,如果你正在尋找一種可移植性更好的與 C 語(yǔ)言模塊交互的方式,考慮下使用 ??ctypes?? 模塊。

源代碼

和往常一樣,你可以在 ??GitHub?? 上找到相關(guān)的源代碼。倉(cāng)庫(kù)中的 C++ 文件有以下用途:

  • ??my_py_module.cpp??: Python 模塊??MyModule?? 的定義
  • ??my_cpp_class.h??: 一個(gè)頭文件 - 只有一個(gè)暴露給 Python 的 C++ 類
  • ??my_class_py_type.h/cpp??: Python 形式的 C++ 類
  • ??pydbg.cpp??: 用于調(diào)試的單獨(dú)應(yīng)用程序

本文構(gòu)建的 Python 模塊不會(huì)有任何實(shí)際用途,但它是一個(gè)很好的示例。

構(gòu)建模塊

在查看源代碼之前,你可以檢查它是否能在你的系統(tǒng)上編譯。??我使用 CMake?? 來(lái)創(chuàng)建構(gòu)建的配置信息,因此你的系統(tǒng)上必須安裝 CMake。為了配置和構(gòu)建這個(gè)模塊,可以讓 Python 去執(zhí)行這個(gè)過(guò)程:

$ python3 setup.py build

或者手動(dòng)執(zhí)行:

$ cmake -B build$ cmake --build build

之后,在 ??/build?? 子目錄下你會(huì)有一個(gè)名為 ??MyModule. so?? 的文件。

定義擴(kuò)展模塊

首先,看一下 ??my_py_module.cpp?? 文件,尤其是 ??PyInit_MyModule?? 函數(shù):

PyMODINIT_FUNCPyInit_MyModule(void) {    PyObject* module = PyModule_Create(&my_module);        PyObject *myclass = PyType_FromSpec(&spec_myclass);    if (myclass == NULL){        return NULL;    }    Py_INCREF(myclass);        if(PyModule_AddObject(module, "MyClass", myclass) < 0){        Py_DECREF(myclass);        Py_DECREF(module);        return NULL;    }    return module;}

這是本例中最重要的代碼,因?yàn)樗?CPython 的入口點(diǎn)。一般來(lái)說(shuō),當(dāng)一個(gè) Python C 擴(kuò)展被編譯并作為共享對(duì)象二進(jìn)制文件提供時(shí),CPython 會(huì)在同名二進(jìn)制文件中(??<ModuleName>.so??)搜索 ??PyInit_<ModuleName>?? 函數(shù),并在試圖導(dǎo)入時(shí)執(zhí)行它。

無(wú)論是聲明還是實(shí)例,所有 Python 類型都是 ??PyObject?? 的一個(gè)指針。在此函數(shù)的第一部分中,??module?? 通過(guò) ??PyModule_Create(...)?? 創(chuàng)建的。正如你在 ??module?? 詳述(??my_py_module??,同名文件)中看到的,它沒(méi)有任何特殊的功能。

之后,調(diào)用 ??PyType_FromSpec?? 為自定義類型 ??MyClass?? 創(chuàng)建一個(gè) Python ??堆類型?? 定義。一個(gè)堆類型對(duì)應(yīng)于一個(gè) Python 類,然后將它賦值給 ??MyModule?? 模塊。

注意,如果其中一個(gè)函數(shù)返回失敗,則必須減少以前創(chuàng)建的復(fù)制對(duì)象的引用計(jì)數(shù),以便解釋器刪除它們。

指定 Python 類型

??MyClass?? 詳述在 ??my_class_py_type.h?? 中可以找到,它作為 ??PyType_Spec?? 的一個(gè)實(shí)例:

static PyType_Spec spec_myclass = {    "MyClass",                                  // name    sizeof(MyClassObject) + sizeof(MyClass),    // basicsize    0,                                          // itemsize    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,   // flags    MyClass_slots                               // slots};

它定義了一些基本類型信息,它的大小包括 Python 表示的大小(??MyClassObject??)和普通 C++ 類的大小(??MyClass??)。??MyClassObject?? 定義如下:

typedef struct {    PyObject_HEAD    int         m_value;    MyClass*    m_myclass;} MyClassObject;

Python 表示的話就是 ??PyObject?? 類型,由 ??PyObject_HEAD?? 宏和其他一些成員定義。成員 ??m_value?? 視為普通類成員,而成員 ??m_myclass?? 只能在 C++ 代碼內(nèi)部訪問(wèn)。

??PyType_Slot?? 定義了一些其他功能:

static PyType_Slot MyClass_slots[] = {    {Py_tp_new,     (void*)MyClass_new},    {Py_tp_init,    (void*)MyClass_init},    {Py_tp_dealloc, (void*)MyClass_Dealloc},    {Py_tp_members, MyClass_members},    {Py_tp_methods, MyClass_methods},    {0, 0} /* Sentinel */};

在這里,設(shè)置了一些初始化和析構(gòu)函數(shù)的跳轉(zhuǎn),還有普通的類方法和成員,還可以設(shè)置其他功能,如分配初始屬性字典,但這是可選的。這些定義通常以一個(gè)哨兵結(jié)束,包含 ??NULL?? 值。

要完成類型詳述,還包括下面的方法和成員表:

static PyMethodDef MyClass_methods[] = {    {"addOne", (PyCFunction)MyClass_addOne, METH_NOARGS,  PyDoc_STR("Return an incrmented integer")},    {NULL, NULL} /* Sentinel */};static struct PyMemberDef MyClass_members[] = {    {"value", T_INT, offsetof(MyClassObject, m_value)},    {NULL} /* Sentinel */};

在方法表中,定義了 Python 方法 ??addOne??,它指向相關(guān)的 C++ 函數(shù) ??MyClass_addOne??。它充當(dāng)了一個(gè)包裝器,它在 C++ 類中調(diào)用 ??addOne()?? 方法。

在成員表中,只有一個(gè)為演示目的而定義的成員。不幸的是,在 ??PyMemberDef?? 中使用的 ??offsetof?? 不允許添加 C++ 類型到 ??MyClassObject??。如果你試圖放置一些 C++ 類型的容器(如 ??std::optional??),編譯器會(huì)抱怨一些內(nèi)存布局相關(guān)的警告。

初始化和析構(gòu)

??MyClass_new?? 方法只為 ??MyClassObject?? 提供一些初始值,并為其類型分配內(nèi)存:

PyObject *MyClass_new(PyTypeObject *type, PyObject *args, PyObject *kwds){    std::cout << "MtClass_new() called!" << std::endl;    MyClassObject *self;    self = (MyClassObject*) type->tp_alloc(type, 0);    if(self != NULL){ // -> 分配成功        // 賦初始值        self->m_value   = 0;        self->m_myclass = NULL;     }    return (PyObject*) self;}

實(shí)際的初始化發(fā)生在 ??MyClass_init?? 中,它對(duì)應(yīng)于 Python 中的 ??__init__()?? 方法:

int MyClass_init(PyObject *self, PyObject *args, PyObject *kwds){        ((MyClassObject *)self)->m_value = 123;        MyClassObject* m = (MyClassObject*)self;    m->m_myclass = (MyClass*)PyObject_Malloc(sizeof(MyClass));    if(!m->m_myclass){        PyErr_SetString(PyExc_RuntimeError, "Memory allocation failed");        return -1;    }    try {        new (m->m_myclass) MyClass();    } catch (const std::exception& ex) {        PyObject_Free(m->m_myclass);        m->m_myclass = NULL;        m->m_value   = 0;        PyErr_SetString(PyExc_RuntimeError, ex.what());        return -1;    } catch(...) {        PyObject_Free(m->m_myclass);        m->m_myclass = NULL;        m->m_value   = 0;        PyErr_SetString(PyExc_RuntimeError, "Initialization failed");        return -1;    }    return 0;}

如果你想在初始化過(guò)程中傳遞參數(shù),必須在此時(shí)調(diào)用 ??PyArg_ParseTuple??。簡(jiǎn)單起見(jiàn),本例將忽略初始化過(guò)程中傳遞的所有參數(shù)。在函數(shù)的第一部分中,??PyObject?? 指針(??self??)被強(qiáng)轉(zhuǎn)為 ??MyClassObject?? 類型的指針,以便訪問(wèn)其他成員。此外,還分配了 C++ 類的內(nèi)存,并執(zhí)行了構(gòu)造函數(shù)。

注意,為了防止內(nèi)存泄漏,必須仔細(xì)執(zhí)行異常處理和內(nèi)存分配(還有釋放)。當(dāng)引用計(jì)數(shù)將為零時(shí),??MyClass_dealloc?? 函數(shù)負(fù)責(zé)釋放所有相關(guān)的堆內(nèi)存。在文檔中有一個(gè)章節(jié)專門講述關(guān)于 C 和 C++ 擴(kuò)展的內(nèi)存管理。

包裝方法

從 Python 類中調(diào)用相關(guān)的 C++ 類方法很簡(jiǎn)單:

PyObject* MyClass_addOne(PyObject *self, PyObject *args){    assert(self);    MyClassObject* _self = reinterpret_cast<MyClassObject*>(self);    unsigned long val = _self->m_myclass->addOne();    return PyLong_FromUnsignedLong(val);}

同樣,??PyObject?? 參數(shù)(??self??)被強(qiáng)轉(zhuǎn)為 ??MyClassObject?? 類型以便訪問(wèn) ??m_myclass??,它指向 C++ 對(duì)應(yīng)類實(shí)例的指針。有了這些信息,調(diào)用 ??addOne()?? 類方法,并且結(jié)果以 ??Python 整數(shù)對(duì)象?? 返回。

3 種方法調(diào)試

出于調(diào)試目的,在調(diào)試配置中編譯 CPython 解釋器是很有價(jià)值的。詳細(xì)描述參閱 ??官方文檔??。只要下載了預(yù)安裝的解釋器的其他調(diào)試符號(hào),就可以按照下面的步驟進(jìn)行操作。

GNU 調(diào)試器

當(dāng)然,老式的 ??GNU 調(diào)試器(GDB)?? 也可以派上用場(chǎng)。源碼中包含了一個(gè) ??gdbinit?? 文件,定義了一些選項(xiàng)和斷點(diǎn),另外還有一個(gè) ??gdb.sh?? 腳本,它會(huì)創(chuàng)建一個(gè)調(diào)試構(gòu)建并啟動(dòng)一個(gè) GDB 會(huì)話:

Gnu 調(diào)試器(GDB)對(duì)于 Python C 和 C++ 擴(kuò)展非常有用

Gnu 調(diào)試器(GDB)對(duì)于 Python C 和 C++ 擴(kuò)展非常有用

GDB 使用腳本文件 ??main.py?? 調(diào)用 CPython 解釋器,它允許你輕松定義你想要使用 Python 擴(kuò)展模塊執(zhí)行的所有操作。

C++ 應(yīng)用

另一種方法是將 CPython 解釋器嵌入到一個(gè)單獨(dú)的 C++ 應(yīng)用程序中。可以在倉(cāng)庫(kù)的 ??pydbg.cpp?? 文件中找到:

int main(int argc, char *argv[], char *envp[]){    Py_SetProgramName(L"DbgPythonCppExtension");    Py_Initialize();    PyObject *pmodule = PyImport_ImportModule("MyModule");    if (!pmodule) {        PyErr_Print();        std::cerr << "Failed to import module MyModule" << std::endl;        return -1;    }    PyObject *myClassType = PyObject_GetAttrString(pmodule, "MyClass");    if (!myClassType) {        std::cerr << "Unable to get type MyClass from MyModule" << std::endl;        return -1;    }    PyObject *myClassInstance = PyObject_CallObject(myClassType, NULL);    if (!myClassInstance) {        std::cerr << "Instantioation of MyClass failed" << std::endl;        return -1;    }    Py_DecRef(myClassInstance); // invoke deallocation    return 0;}

使用 ??高級(jí)接口??,可以導(dǎo)入擴(kuò)展模塊并對(duì)其執(zhí)行操作。它允許你在本地 IDE 環(huán)境中進(jìn)行調(diào)試,還能讓你更好地控制傳遞或來(lái)自擴(kuò)展模塊的變量。

缺點(diǎn)是創(chuàng)建一個(gè)額外的應(yīng)用程序的成本很高。

VSCode 和 VSCodium LLDB 擴(kuò)展

使用像 ??CodeLLDB?? 這樣的調(diào)試器擴(kuò)展可能是最方便的調(diào)試選項(xiàng)。倉(cāng)庫(kù)包含了一些 VSCode/VSCodium 的配置文件,用于構(gòu)建擴(kuò)展,如 ??task.json??、??CMake Tools?? 和調(diào)用調(diào)試器(??launch.json??)。這種方法結(jié)合了前面幾種方法的優(yōu)點(diǎn):在圖形 IDE 中調(diào)試,在 Python 腳本文件中定義操作,甚至在解釋器提示符中動(dòng)態(tài)定義操作。

VSCodium 有一個(gè)集成的調(diào)試器。

VSCodium 有一個(gè)集成的調(diào)試器。

用 C++ 擴(kuò)展 Python

Python 的所有功能也可以從 C 或 C++ 擴(kuò)展中獲得。雖然用 Python 寫代碼通常認(rèn)為是一件容易的事情,但用 C 或 C++ 擴(kuò)展 Python 代碼是一件痛苦的事情。另一方面,雖然原生 Python 代碼比 C++ 慢,但 C 或 C++ 擴(kuò)展可以將計(jì)算密集型任務(wù)提升到原生機(jī)器碼的速度。

你還必須考慮 ABI 的使用。穩(wěn)定的 ABI 提供了一種方法來(lái)保持舊版本 CPython 的向后兼容性,如 ??文檔?? 所述。

最后,你必須自己權(quán)衡利弊。如果你決定使用 C 語(yǔ)言來(lái)擴(kuò)展 Python 中的一些功能,你已經(jīng)看到了如何實(shí)現(xiàn)它。

責(zé)任編輯:龐桂玉 來(lái)源: Linux中國(guó)
相關(guān)推薦

2011-09-16 10:00:56

C++

2011-11-24 15:08:40

C++

2021-05-28 18:12:51

C++設(shè)計(jì)

2010-01-15 18:57:58

C++CLI

2019-10-29 05:47:15

CC++Python

2010-03-01 09:43:09

Python編程語(yǔ)言

2013-07-18 09:58:18

C++程序員

2021-04-14 07:47:58

PythonC++數(shù)組

2022-03-22 06:33:49

Python內(nèi)置模塊函數(shù)

2018-10-31 10:11:24

Python編程語(yǔ)言語(yǔ)音播放

2022-03-24 14:42:19

Python編程語(yǔ)言

2022-06-27 09:54:38

編程語(yǔ)言JavaC++

2019-05-16 14:50:32

CythonPython編程語(yǔ)言

2010-01-14 11:14:47

C++應(yīng)用程序

2017-06-20 12:48:55

React Nativ自定義模塊Note.js

2021-10-27 11:29:32

框架Web開發(fā)

2024-03-13 13:53:10

C++程序開發(fā)

2017-02-13 16:47:13

iOSDSL開發(fā)

2010-02-06 13:47:08

C++標(biāo)準(zhǔn)擴(kuò)展

2021-05-14 10:45:21

PythonNoSQL數(shù)據(jù)庫(kù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

亚洲一区二区三区精品视频| 国产精品久久久久久久av电影| 污污免费在线观看| 亚洲国产成人二区| 国产欧美日本一区二区三区| 国产精品成人久久久久| 在线观看成人毛片| 亚洲小说图片视频| 日韩视频国产视频| 日日碰狠狠躁久久躁婷婷| 欧美黑人激情| ww亚洲ww在线观看国产| 91精品久久久久久久| 中文字幕在线观看免费视频| 日本久久一二三四| 精品国产伦一区二区三区免费| 日韩欧美在线免费观看视频| 性欧美videos高清hd4k| 久久无码av三级| 91在线看网站| www.久久网| 亚洲福利电影| 久久亚洲欧美日韩精品专区| 国产ts丝袜人妖系列视频| 91精品视频一区二区| 色综合色综合色综合色综合色综合| 影音先锋男人的网站| 韩日在线视频| 99久久精品免费| 91精品免费| 一区二区三区黄| 日日嗨av一区二区三区四区| 国模私拍视频一区| 国产精品 欧美激情| 国产一区二区三区探花 | 天堂一区在线观看| 免费h在线看| 洋洋av久久久久久久一区| 亚洲欧洲中文天堂| 国产成人免费av电影| 美女视频黄免费| 天天做天天爱天天综合网2021| 亚洲码在线观看| 日本黄色动态图| 一本一道久久a久久| 欧美年轻男男videosbes| 92看片淫黄大片一级| 麻豆mv在线观看| 性欧美疯狂xxxxbbbb| 久久久国内精品| 亚洲区欧洲区| 亚洲图片一区二区| 2018国产在线| 国产乱码精品一区二三赶尸艳谈| 亚洲午夜久久久久久久久电影院| www.激情网| 日本片在线看| 午夜婷婷国产麻豆精品| 久久国产精品网| 男女在线观看视频| 亚洲黄色免费网站| 高清无码视频直接看| 日韩av激情| 亚洲第一激情av| 九一国产精品视频| 老司机深夜福利在线观看| 日韩欧美视频一区二区三区| 国产熟女高潮视频| 91精品xxx在线观看| 欧美性一二三区| 色播五月综合网| 国产精品亚洲欧美一级在线| 欧美一区二区三区啪啪| 亚洲美女精品视频| 日韩动漫一区| 伊人久久久久久久久久| 欧美一区二区三区观看| 欧美激情一级片一区二区| 欧美激情亚洲视频| 午夜精品三级久久久有码| 久久综合九色| 国产欧美日韩中文字幕| 精品国产av 无码一区二区三区| 国产电影一区在线| 黑人另类av| 成人在线观看一区| 亚洲精品视频一区| 色综合久久久久无码专区| 日韩欧美一区二区三区免费观看| 欧美日韩一级大片网址| 超级砰砰砰97免费观看最新一期 | 欧美bbbxxxxx| 欧美视频二区36p| 奇米影视四色在线| 一区二区三区四区精品视频| 亚洲人成电影在线| 91狠狠综合久久久| 亚洲在线视频| 91免费国产网站| 亚洲欧美日韩动漫| 亚洲欧洲日韩综合一区二区| 国产免费黄色一级片| 91久久久久久白丝白浆欲热蜜臀| 欧美变态凌虐bdsm| 成人黄色免费网址| 伊人狠狠色j香婷婷综合| 国产精品流白浆视频| 亚洲av无码一区二区三区性色| 久久久99精品久久| 日韩a级黄色片| 全球最大av网站久久| 精品裸体舞一区二区三区| 国产全是老熟女太爽了| 欧美日韩国产综合网| 国产精品扒开腿做爽爽爽视频| 国产三级小视频| 国产日韩欧美一区二区三区综合| 国产 国语对白 露脸 | 欧美三级电影精品| 黄色av电影网站| 久久人体视频| 日韩免费观看网站| 天堂在线资源库| 日韩一区在线播放| 国产精品人人爽人人爽| 日韩欧美美女在线观看| 欧美乱妇高清无乱码| 中文字幕+乱码+中文| 2017欧美狠狠色| 自拍视频一区二区三区| 99亚洲伊人久久精品影院| 亚洲美女视频网| 日韩成年人视频| 国产+成+人+亚洲欧洲自线| 在线国产伦理一区| www.一区| 在线电影中文日韩| 在线观看国产区| 久久蜜臀精品av| 逼特逼视频在线| 国产一区二区在线视频你懂的| 欧美xxxx做受欧美| 国产三级漂亮女教师| 视频欧美精品| 欧美一区二区视频网站| 国产麻豆a毛片| 精品一区二区三区蜜桃| 樱花www成人免费视频| 韩国精品视频在线观看 | 欧美视频精品在线| 男人的天堂官网| 日韩国产欧美在线视频| 久久国产一区| 国产精品久久不卡| 久久久9色精品国产一区二区三区| 国产精品久久久久久影视| 国产免费视频在线| 欧美性做爰猛烈叫床潮| 久草手机视频在线观看| 国产在线精品一区二区不卡了 | 中文在线一区二区三区| 亚洲综合另类| 久久青青草综合| 亚洲成av在线| 久久婷婷国产麻豆91天堂| 99精品视频在线播放免费| 亚洲午夜精品在线| 99久久久无码国产精品性| 日韩av在线免费观看不卡| 一区二区三区四区免费视频| 日本亚洲视频| 欧美性受xxx| 爱爱爱免费视频在线观看| 在线电影一区二区三区| 欧美成人一二三区| 91农村精品一区二区在线| 国产又猛又黄的视频| 亚洲综合小说| 精品免费一区二区三区蜜桃| 欧美日韩免费观看视频| 久久久精品影院| 日韩在线视频第一页| 在线免费亚洲电影| 印度午夜性春猛xxx交| 成人动漫在线一区| 婷婷六月天在线| 亚洲欧美亚洲| 欧美在线一二三区| 欧美久久亚洲| 国产国语刺激对白av不卡| 黄色在线播放网站| 精品小视频在线| 国产三级伦理片| 日韩欧美中文第一页| 亚洲熟女少妇一区二区| 成人黄色大片在线观看| 成人高清dvd| 色综合中文网| 亚洲在线免费观看| 超碰97国产精品人人cao| 在线精品91av| 囯产精品久久久久久| 91福利社在线观看| 色欲人妻综合网| 91小视频在线观看| 黄色小视频免费网站| 在线成人av| 最近免费观看高清韩国日本大全| 欧美大胆a级| 成人黄色av网| 在线免费av资源| 色综合男人天堂| 美丽的姑娘在线观看免费动漫| 777久久久精品| 久久国产精品免费看| 国产精品福利一区二区三区| 久久久久国产精品无码免费看| 日韩不卡一区二区三区| 性一交一乱一伧国产女士spa| 亚洲影院天堂中文av色| 97超级在线观看免费高清完整版电视剧| 日本а中文在线天堂| 欧美精品www在线观看| 91高清在线视频| 精品一区电影国产| 亚洲成人中文字幕在线| 这里只有精品99re| 中文字幕视频二区| 欧美日韩一区二区三区| 黄色一级片在线| 国产精品理伦片| 久久久久亚洲av无码专区桃色| 国产成人免费视频精品含羞草妖精| 亚洲xxx在线观看| 久久久xxx| 日本精品免费在线观看| 雨宫琴音一区二区在线| 国产911在线观看| 精品久久久亚洲| 免费观看成人在线| 老司机成人在线| 国产精成人品localhost| 999精品视频在线观看| 91精品在线一区| 日本黄色一区| 国产极品jizzhd欧美| 欧美大片免费| 日韩av片电影专区| 韩日毛片在线观看| 国内外成人免费激情在线视频网站| 丰满诱人av在线播放| 欧美成人合集magnet| 精品国产丝袜高跟鞋| 一二美女精品欧洲| 思思99re6国产在线播放| 中文字幕久久久| 高清美女视频一区| 最近的2019中文字幕免费一页| 番号在线播放| 国产一区二区三区久久精品| 极品白浆推特女神在线观看| 伊人久久大香线蕉av一区二区| 成人高清在线| 日韩视频在线免费观看| 激情成人四房播| 久久天堂电影网| caoporn97在线视频| 欧美精品情趣视频| 欧美极品videos大乳护士| 97精品免费视频| 在线观看的黄色| 国产精品免费视频久久久| 欧美成人家庭影院| 91精品视频免费观看| 国产精品久久久久久久久久辛辛| www.一区二区三区| 久久精品国产亚洲blacked| 精品久久蜜桃| 婷婷亚洲五月| 国产 欧美 日韩 一区| 亚洲激情不卡| 国产精品天天av精麻传媒| 免费成人在线观看| ass极品水嫩小美女ass| www.欧美色图| 一级在线观看视频| 一区二区三区四区视频精品免费| 午夜精品三级久久久有码| 欧美日韩激情一区二区| 国产乱人乱偷精品视频| 精品成人一区二区三区四区| 男人天堂手机在线观看| 一区二区三区久久精品| 成人日韩欧美| 2025国产精品视频| 国产精品久一| 噜噜噜噜噜久久久久久91| 久久人体视频| 91精品91久久久中77777老牛| 日本不卡一区二区| 日韩高清一二三区| 久久久91精品国产一区二区精品| 懂色av蜜臀av粉嫩av永久| 亚洲地区一二三色| 草莓视频18免费观看| 精品国产乱码久久久久久浪潮| 国产精品久久久久一区二区国产| 久久国产精品亚洲| 国产原创一区| 精品亚洲欧美日韩| 亚洲草久电影| 九九九在线观看视频| 成人丝袜视频网| 无码人中文字幕| 在线观看91视频| 色窝窝无码一区二区三区| 中文字幕av日韩| 婷婷午夜社区一区| 国产精品一区二区三区在线| 欧美a级片视频| 亚洲综合日韩欧美| 99免费精品在线| 蜜臀久久精品久久久用户群体| 欧美午夜视频网站| 三级毛片在线免费看| 欧美极品少妇全裸体| 精品国产一区二| 亚洲欧美日韩国产成人综合一二三区| 国产视频一区三区| 国产精品手机在线观看| 亚洲美女区一区| 在线观看xxxx| 日韩在线国产精品| 偷拍精品精品一区二区三区| 狠狠色综合欧美激情| 亚洲性人人天天夜夜摸| 欧美日韩理论片| 中文天堂在线一区| 特级西西444www高清大视频| 亚洲精品国精品久久99热一| 中文字幕在线观看播放| 亚洲aⅴ男人的天堂在线观看 | www日韩精品| 日韩一区二区三区精品视频| 污视频免费在线观看| 成人免费看片视频| 欧美电影免费观看高清| www.夜夜爽| 欧美高清在线视频| 在线免费观看av网址| 在线精品国产成人综合| 高清av一区二区三区| 日韩电影免费观看在| 免费成人你懂的| 成年人视频软件| 欧美日韩一本到| 菠萝菠萝蜜在线视频免费观看| 国产在线观看一区二区三区 | 成人自拍视频网| 日韩欧美在线电影| 日韩精品一区第一页| 欧美特级黄色录像| 91久久香蕉国产日韩欧美9色| 国产福利在线看| 国产精品爽爽爽爽爽爽在线观看| 成人影院天天5g天天爽无毒影院| 成人黄色一级大片| 亚洲欧美日韩在线| 亚洲精品第五页| 国产999在线| 久久性感美女视频| 亚洲免费在线播放视频| 亚洲一区免费在线观看| 四季av日韩精品一区| 欧亚精品中文字幕| 国产国产精品| 亚洲成人福利视频| 91福利在线看| 黄网页免费在线观看| 99re6热在线精品视频播放速度| 国产精品一国产精品k频道56| 亚洲自拍偷拍图| 欧美久久久久久蜜桃| аⅴ资源天堂资源库在线| 久久伊人一区二区| 美女日韩在线中文字幕| 少妇人妻丰满做爰xxx| 亚洲第一免费网站| 久久久久伊人| 日本免费a视频| 久久久久亚洲蜜桃| www.久久伊人| 日韩美女免费线视频| 久久久久午夜电影| 中文在线一区二区三区| 欧美午夜片在线看| 国产精品原创| 黄频视频在线观看| 成人中文字幕合集| 亚洲永久精品视频|