当前位置: 首页 > news >正文

寻找南昌网站设计单位网页管理平台

寻找南昌网站设计单位,网页管理平台,人与狗做的网站谁有,长兴网站建设Boost 库是一个由C/C语言的开发者创建并更新维护的开源类库#xff0c;其提供了许多功能强大的程序库和工具#xff0c;用于开发高质量、可移植、高效的C应用程序。Boost库可以作为标准C库的后备#xff0c;通常被称为准标准库#xff0c;是C标准化进程的重要开发引擎之一。…Boost 库是一个由C/C语言的开发者创建并更新维护的开源类库其提供了许多功能强大的程序库和工具用于开发高质量、可移植、高效的C应用程序。Boost库可以作为标准C库的后备通常被称为准标准库是C标准化进程的重要开发引擎之一。使用Boost库可以加速C应用程序的开发过程提高代码质量和性能并且可以适用于多种不同的系统平台和编译器。Boost库已被广泛应用于许多不同领域的C应用程序开发中如网络应用程序、图像处理、数值计算、多线程应用程序和文件系统处理等。 C的指针操作可以说是继承了C语言的优点但同时也带来了一些问题例如内存泄漏、悬挂指针、访问越界等。这些问题不仅会导致程序运行错误还会对系统稳定性造成影响。为了避免这些问题Boost库提供了一套高效的自动内存管理指针操作函数这些函数使用引用计数技术来管理内存。 2.1 使用Pool内存池 boost::pool是Boost库中一个内存池管理器用于高效地管理和分配内存。在程序中动态分配和释放内存是很常见的操作但频繁的内存分配和释放会导致开销很大影响程序性能。boost::pool针对这个问题提供了一个解决方案它可以预分配并缓存一定数量的内存块通过重复利用这些内存块来减小内存分配释放的开销提高程序性能。 #include iostream #include boost/pool/pool.hppusing namespace std; using namespace boost;int main(int argc, char const *argv[]) {boost::pool pool(sizeof(int)); // 定义整数内存池(int/float/double)int *ptr[10] { 0 }; // 定义指针列表for (int x 0; x 10; x){ptr[x] static_castint *(pool.malloc()); // 开辟空间并转为指针if (ptr[x] nullptr)cout 分配空间失败 endl;}// 分别对内存空间赋值for (int x 0; x 10; x)*ptr[x] x;// 输出数据for (int x 0; x 10; x){cout 内存地址: ptr[x] 数值: *ptr[x] endl;}getchar();return 0; }Pool内存池同样提供了对容器的存储方法我们在使用时只需要包含头文件pool_alloc.hpp当包含此头文件后读者可使用pool_allocator模板类对容器内的特殊成员进行初始化。 #include iostream #include string #include vector #include boost/pool/pool.hpp #include boost/pool/pool_alloc.hppusing namespace std; using namespace boost;typedef struct {int uuid;string uname; }MyStruct;int main(int argc, char const *argv[]) {// 应用标准容器: 定义存储string类型的容器std::vectorstd::string, pool_allocatorstd::string vect;// 设置容器vect.push_back(admin);vect.push_back(lyshark);for (int x 0; x vect.size(); x){std::cout 输出: vect[x] std::endl;}// 应用自定义数据类型std::vectorMyStruct, pool_allocatorMyStruct pool_ptr;MyStruct ptr;ptr.uuid 10001;ptr.uname lyshark;pool_ptr.push_back(ptr);ptr.uuid 1002;ptr.uname admin;pool_ptr.push_back(ptr);for (int x 0; x pool_ptr.size(); x){std::cout UUID: pool_ptr[x].uuid Name: pool_ptr[x].uname std::endl;}std::system(pause);return 0; }2.2 使用ObjectPool内存池 boost::object_pool是Boost库中的一个内存池管理器可以用来高效地分配和释放内存并能够管理多个大小相等的对象。 在使用boost::object_pool时我们可以先创建一个大小固定的内存池然后使用malloc()函数从内存池中分配内存并在内存上构造一个对象。当我们需要释放内存时可以调用destroy()函数显式地销毁对象并使用free()函数释放内存。 #include iostream #include string #include boost/pool/object_pool.hppusing namespace std; using namespace boost;struct MyStruct { public:int uuid;string uname;int uage;MyStruct(int uuid_, string uname_, int uage_){uuid uuid_; uname uname_; uage uage_;} };int main(int argc, char const *argv[]) {boost::object_poolMyStruct object;auto ptr object.malloc();// 默认最多只能传递3个参数ptr object.construct(1001,lyshark,25); // 为构造函数传递参数cout 姓名: ptr-uname endl;std::system(pause);return 0; }一般在默认情况下object_pool内存池只能接收三个以内的参数传递当读者需要使用多于三个参数时则需要使用自定义可变参数模板来实现功能我们以接受四个参数为例定义construct模板并在该模板内部实现分配资源。 #include iostream #include string #include boost/pool/object_pool.hppusing namespace std; using namespace boost;struct MyStruct { public:int uuid;string uname;int uage;string usex;MyStruct(int uuid_, string uname_, int uage_, string usex_){uuid uuid_; uname uname_; uage uage_; usex usex_;} };// 定义可变参数模板,用来实现接受三个以上的参数 templatetypename P, typename ... Args inline typename P::element_type* construct(P p, Args ... args) {typename P::element_type* mem p.malloc();new(mem) typename P::element_type(std::forwardArgs(args)...);return mem; }int main(int argc, char const *argv[]) {boost::object_poolMyStruct object;auto ptr object.malloc();// 接收四个参数写法auto ref construct(object, 1001, lyshark, 24, 男);cout 姓名: ref-uname endl;object.free(ref);object.free(ptr);std::system(pause);return 0; }2.3 使用SharedPtr智能指针 boost::shared_ptr是Boost库中的一个智能指针用于自动管理动态分配的内存。它跟踪有多少个shared_ptr实例共享同一个对象当最后一个实例离开作用域时它会自动释放分配的内存。 该函数是boost.smart_ptr库中最重要的智能指针shared_ptr包装了new操作符在堆上分配的动态对象实现了引用计数型的智能指针可被自由的拷贝和赋值并在任意地方共享。 #include iostream #include string #include boost/smart_ptr.hppusing namespace std; using namespace boost;int main(int argc, char const *argv[]) {// 基本的定义与赋值boost::shared_ptrint int_ptr(new int);*int_ptr 1024;cout 指针: int_ptr 数值: *int_ptr endl;boost::shared_ptrstring string_ptr(new string);*string_ptr hello lyshark;cout 指针: string_ptr 长度: string_ptr-size() endl;// 拷贝构造的使用boost::shared_ptrint shared_ptr(new int(10)); // 定义指向整数的sharedcout 持有者: shared_ptr.unique() endl;boost::shared_ptrintshared_copy shared_ptr; // 实现拷贝cout 引用数: shared_ptr.use_count() endl;shared_ptr.reset(); // 关闭shared的使用getchar();return 0; }在有时候我们需要使用多个指针并将多个指针分别指向不同的数据集合此时我们可以先封装一个MyShared类并使用循环的方式初始化创建内存空间每次创建空间后将该空间存储至vect容器内最后再以此循环输出该容器内存所有自定义类元素即可 #include iostream #include vector #include string #include boost/shared_ptr.hppusing namespace std; using namespace boost;// 定义Shared类 class MyShared { private:int shared_uuid;std::string shared_name;public:MyShared(int x, std::string y){shared_uuid x;shared_name y;}std::string GetName(){return shared_name;}int GetUUID(){return shared_uuid;} };int main(int argc, char const *argv[]) {std::vectorboost::shared_ptrMyShared vect;// 循环开辟空间,并放入vector列表for (int x 0; x 5; x){boost::shared_ptrMyShared ptr(new MyShared(x,hello lyshark));vect.push_back(ptr);}// 输出列表中的元素for (int x 0; x vect.size(); x){std::cout UUID: vect[x]-GetUUID() Name: vect[x]-GetName() std::endl;}std::system(pause);return 0; }智能指针同样支持使用引用计数器功能在指针内部读者可通过使用ptr.use_count()来输出当前的计数器当此处代码没有被使用是则引用计数器会为0而当代码或多个进程使用时则引用计数器相应的会增加查询引用计数器可以如下所示 #include iostream #include string #include boost/shared_ptr.hppusing namespace std; using namespace boost;class MyShared { private:boost::shared_ptrint ptr; public:MyShared(boost::shared_ptrint p_) :ptr(p_){}void print(){cout 内部 计数: ptr.use_count() 数值: *ptr endl;} };// 自动拷贝一个对象,所以引用计数会1 void print_func(boost::shared_ptrint ptr) {cout 外部 计数: ptr.use_count() 数值: *ptr endl; }int main(int argc, char const *argv[]) {boost::shared_ptrint ptr(new int(100)); // 定义整数指针MyShared s1(ptr), s2(ptr); // 定义两个对象,并初始化s1.print();s2.print();*ptr 200;print_func(ptr);s1.print();s2.print();std::system(pause);return 0; }如上在声明了shared_ptr和两个MyShared类后指针被共享因此引用计数为3调用print_func()函数该函数内部拷贝了一个shared_ptr对象因此引用计数再次增加1但退出函数时拷贝自动析构引用计数又会恢复为3。 2.4 使用MakeShared工厂函数 boost::make_shared是一个工厂函数用于动态分配一个对象并返回一个智能指针它是Boost库中的一个组件。使用make_shared我们可以将对象的构造和内存分配合并在一起避免了常规构造函数和动态内存分配的性能损失和代码冗余。 当读者使用2.3节中所示的shared_ptr智能指针时虽然能够很好的消除delete释放的调用但我们还是需要使用new方法来构造初始化数据集为了能够不再使用new关键字在smart_ptr库中提供了一个工厂函数make_shared()函数用于消除使用new创建数据集工厂函数常用于初始化特定的指针数据如下所示 #include iostream #include string #include vector #include boost/smart_ptr.hppusing namespace std; using namespace boost;int main(int argc, char const *argv[]) {// make_shared 工厂函数初始化boost::shared_ptrstring string_ptr boost::make_sharedstring(hello lyshark);cout 初始化字符串: *string_ptr endl;// 应用于标准容器中typedef std::vectorboost::shared_ptrint vector_ptr; // 定义标准容器类型vector_ptr vect(10); // 定义拥有十个元素的容器// 初始化赋值int x 0;for (auto pos vect.begin(); pos ! vect.end(); pos){(*pos) boost::make_sharedint(x); // 工厂函数初始化cout 输出值: *(*pos) endl; // 输出数据(两次解引用)}// 修改数据boost::shared_ptrint int_ptr vect[9]; // 获取最后一个数值*int_ptr 100; // 修改最后一个数值cout 修改后: *vect[9] endl;// 第二种输出方式(一次解引用完成)x 0;for (auto ptr : vect){cout 输出值: *ptr endl;}std::system(pause);return 0; }2.5 使用SharedPtr桥接模式 在C中shared_ptr有一种常用的设计模式是桥接模式Bridge Design Pattern又称为PIMPL模式。桥接模式的主要作用是将实现细节从类的接口中分离出来从而使得接口和实现可以独立变化提高了类的可扩展性和可维护性。 使用shared_ptr实现桥接模式时我们可以使用一个基类和多个派生类的继承关系并使用shared_ptr来管理对象的生命周期。通过使用shared_ptr的引用计数技术可以动态地改变派生类的具体实现而不会影响到基类接口的实现。其仅对外部暴漏最小的细节内部类实现用一个shared_ptr来保存指针。 如下代码所示首先我们定义MyShared作为基类其内部存在一个print输出函数而该函数通过boost::shared_ptrimpl ptr;指向impl基址当输出内容时自动桥接到impl派生类上的print函数上。 #include iostream #include string #include vector #include boost/smart_ptr.hppusing namespace std; using namespace boost;// 定义基类 class MyShared { private:class impl;boost::shared_ptrimpl ptr;public:MyShared();void print(); };// 定义桥接类 class MyShared::impl { public:void print(){cout 输出桥接类 endl;} };MyShared::MyShared() :ptr(new impl){}void MyShared::print() {ptr-print(); }int main(int argc, char const *argv[]) {MyShared lsp;lsp.print();std::system(pause);return 0; }2.6 使用SharedPtr工厂模式 在C中shared_ptr还可以与工厂模式Factory Design Pattern结合使用工厂模式是一种创建型设计模式该模式包装了new操作符的使用使对象的创建工作集中在工厂类或工厂函数上通过创建和返回智能指针从而实现动态创建对象并自动管理其生命周期的功能。 通常开发中自己编写的工厂类都会在堆上使用new动态分配对象然后返回对象指针当忘记释放delete时内存泄漏就会产生。当使用shared_ptr实现工厂模式时我们可以将工厂类中的创建对象的方法返回一个shared_ptr对象从而避免手动管理动态分配的内存。 如下代码所示我们使用shared_ptr封装接口让impl类不再返回原始指针而是返回shared_ptr包装的智能指针这样就可以很好的保护资源。 #include iostream #include boost/smart_ptr.hppusing namespace std; using namespace boost;// 定义基类 全部为虚函数 class abstract { public:virtual void MyPrint() 0; protected:virtual ~abstract() default; };// 派生类实现虚函数 class impl :public abstract { public:impl() default;virtual ~impl() default;public:virtual void MyPrint(){cout 调用方法完成. endl;} };// 工厂函数返回基类的 基址指针 返回类型为 shared_ptr boost::shared_ptrabstract create() {return boost::make_sharedimpl(); }int main(int argc, char const *argv[]) {// 第一种调用方式auto ptr create();ptr-MyPrint();// 第二种方式abstract *abstract_ptr ptr.get();abstract_ptr-MyPrint();// 强制转换,后输出impl *impl_ptr (impl*)(ptr.get());impl_ptr-MyPrint();std::system(pause);return 0; }2.7 使用SharedPtr资源共享 使用shared_ptr实现资源共享时我们可以创建多个shared_ptr对象让它们共同管理同一个动态分配的对象从而避免了内存泄漏和错误释放内存的情况。 如下案例中我们定义了shared_vector类当MyShared中的内容发生变化时由于ptr指向了MyShared类则ptr中的值也会随着MyShared中的内容的变化而变化。 #include iostream #include memory #include vector #include stringusing namespace std;class shared_vector { public:typedef vectorstring::size_type size_type;shared_vector() : data(make_sharedvectorstring()){}shared_vector(initializer_liststring il) : data(make_sharedvectorstring(il)){}size_type size()const{ return data-size(); }bool empty()const{ return data-empty(); }//尾部插入删除元素 void push_back(const string s){ data-push_back(s); }void pop_back(){ data-pop_back(); }//访问元素 string front(){ return data-front(); }string back(){ return data-back(); } private:shared_ptrvectorstring data; };int main(int argc, char const *argv[]) {shared_vector MyShared{ admin, lyshark };shared_vector ptr(MyShared);ptr.push_back(administrator);cout 发生变化: MyShared.back() endl;std::system(pause); }2.8 使用WeakPtr智能指针 weak_ptr是C11中的智能指针它用于解决shared_ptr可能引起的循环引用问题。与shared_ptr不同weak_ptr并不持有所指对象的所有权因此它不能直接访问所指向的对象。它只是提供了一种通过shared_ptr访问所指向对象的方式并且在没有引用时可以自动弱化其引用。 在使用weak_ptr时通常需要先从一个shared_ptr对象创建一个weak_ptr对象。我们可以通过lock()函数获取指向所指对象的shared_ptr对象然后通过这个shared_ptr对象来访问所指对象。 如果简单来说这个指针的出现只是为了配合shared_ptr使用的其本身并不具备普通指针的行为其主要的作用在于协助shared_ptr工作像旁观者一样观察资源的使用情况。 #include iostream #include boost/smart_ptr.hppusing namespace std; using namespace boost;int main(int argc, char const *argv[]) {boost::shared_ptrint ptr(new int(10));boost::weak_ptrint weak(ptr);// 判断weak_ptr观察的对象是否失效if (!weak.expired()){// 获得一个shared_ptrboost::shared_ptrint new_ptr weak.lock();*new_ptr 100;}ptr.reset();std::system(pause);return 0; }weak_ptr还可以用于对象自我管理如获得this指针的shared_ptr使对象自己能产生shared_ptr管理自己使用时需要定义类并继承于enable_shared_from_this接口。 #include iostream #include boost/smart_ptr.hpp #include boost/enable_shared_from_this.hppusing namespace std; using namespace boost;class self_my_shared_ptr : public boost::enable_shared_from_thisself_my_shared_ptr { public:self_my_shared_ptr(int n) :x(n){}int x;void print(){std::cout 自身指针: x std::endl;} };int main(int argc, char const *argv[]) {auto ptr boost::make_sharedself_my_shared_ptr(100);ptr-print();auto p ptr-shared_from_this();p-x 200;p-print();std::system(pause);return 0; }有时候代码中可能会出现循环引用的情况此时使用shared_ptr指针时计数器就会失效导致无法正确释放资源例如如下一个案例两个节点对象互相持有对方的引用每个引用计数器都是2在析构时引用计数没有变为0因此不会调用删除清理操作所以会导致内存泄漏的产生。 #include iostream #include boost/smart_ptr.hpp #include boost/enable_shared_from_this.hppusing namespace std; using namespace boost;class node { public:~node(){std::cout 析构函数,被调用. std::endl;}typedef boost::shared_ptrnode ptr_type;ptr_type next; };int main(int argc, char const *argv[]) {auto ptrA boost::make_sharednode();auto ptrB boost::make_sharednode();ptrA-next ptrB;ptrB-next ptrA;std::cout ptrA 计数器: ptrA.use_count() std::endl;std::cout ptrB 计数器: ptrB.use_count() std::endl;std::system(pause);return 0; }为了解决上述的内存泄露问题我们需要使用weak_ptr智能指针将原来的强引用模式改为弱引用模式即可实现动态释放循环引用即可消失。 #include iostream #include boost/smart_ptr.hpp #include boost/enable_shared_from_this.hppusing namespace std; using namespace boost;class node { public:~node(){std::cout 析构函数,被调用. std::endl;}typedef boost::weak_ptrnode ptr_type;ptr_type next; };int main(int argc, char const *argv[]) {auto ptrA boost::make_sharednode();auto ptrB boost::make_sharednode();ptrA-next ptrB;ptrB-next ptrA;std::cout ptrA 计数器: ptrA.use_count() std::endl;std::cout ptrB 计数器: ptrB.use_count() std::endl;// 检查弱引用是否有效if (!ptrA-next.expired()){// 获取到强引用指针auto ptrC ptrA-next.lock();}std::system(pause);return 0; }2.9 使用IntrusivePtr计数器 intrusive_ptr是一个智能指针与shared_ptr类似都具有引用计数的功能。它是一个轻量级的智能指针相比于标准库中的shared_ptrintrusive_ptr可以方便地在自定义数据结构中使用因为它不需要在自定义类型中维护额外的引用计数器。 该指针采用了惯用法即将引用计数器作为自定义类型的一部分存储在实例中。因此使用intrusive_ptr时需要为自定义类型提供一个内部引用计数器的实现。 #include iostream #include boost/smart_ptr.hpp #include boost/smart_ptr/intrusive_ref_counter.hppusing namespace std; using namespace boost;struct data {int m_count 0;~data(){cout 结束. endl;} };// 递增 void intrusive_ptr_add_ref(data* p) {p-m_count p-m_count 10; }// 递减 void intrusive_ptr_release(data* p) {if (--p-m_count 0){delete p;} }int main(int argc,char *argv[]) {// 使用自定义引用计数typedef intrusive_ptrdata counted_ptr;counted_ptr p(new data);std::cout 引用数: p-m_count std::endl;counted_ptr weak_p(p.get(), false);std::cout 引用数: p-m_count std::endl;std::system(pause);return 0; }本文作者 王瑞 本文链接 https://www.lyshark.com/post/bc8ff67e.html 版权声明 本博客所有文章除特别声明外均采用 BY-NC-SA 许可协议。转载请注明出处
文章转载自:
http://www.morning.jrbyz.cn.gov.cn.jrbyz.cn
http://www.morning.xxiobql.cn.gov.cn.xxiobql.cn
http://www.morning.ydtdn.cn.gov.cn.ydtdn.cn
http://www.morning.mrlls.cn.gov.cn.mrlls.cn
http://www.morning.kxnjg.cn.gov.cn.kxnjg.cn
http://www.morning.wxfgg.cn.gov.cn.wxfgg.cn
http://www.morning.nnwmd.cn.gov.cn.nnwmd.cn
http://www.morning.mynbc.cn.gov.cn.mynbc.cn
http://www.morning.zhnyj.cn.gov.cn.zhnyj.cn
http://www.morning.chgmm.cn.gov.cn.chgmm.cn
http://www.morning.lmhwm.cn.gov.cn.lmhwm.cn
http://www.morning.txrkq.cn.gov.cn.txrkq.cn
http://www.morning.hwxxh.cn.gov.cn.hwxxh.cn
http://www.morning.rqckh.cn.gov.cn.rqckh.cn
http://www.morning.thrtt.cn.gov.cn.thrtt.cn
http://www.morning.zrkws.cn.gov.cn.zrkws.cn
http://www.morning.cjsrg.cn.gov.cn.cjsrg.cn
http://www.morning.yfcyh.cn.gov.cn.yfcyh.cn
http://www.morning.rtjhw.cn.gov.cn.rtjhw.cn
http://www.morning.xtlty.cn.gov.cn.xtlty.cn
http://www.morning.pnbls.cn.gov.cn.pnbls.cn
http://www.morning.wzwyz.cn.gov.cn.wzwyz.cn
http://www.morning.pcrzf.cn.gov.cn.pcrzf.cn
http://www.morning.mjtft.cn.gov.cn.mjtft.cn
http://www.morning.lzqxb.cn.gov.cn.lzqxb.cn
http://www.morning.xrmwc.cn.gov.cn.xrmwc.cn
http://www.morning.jopebe.cn.gov.cn.jopebe.cn
http://www.morning.qrmry.cn.gov.cn.qrmry.cn
http://www.morning.mcpdn.cn.gov.cn.mcpdn.cn
http://www.morning.wmfny.cn.gov.cn.wmfny.cn
http://www.morning.ddzqx.cn.gov.cn.ddzqx.cn
http://www.morning.wfcqr.cn.gov.cn.wfcqr.cn
http://www.morning.bnpn.cn.gov.cn.bnpn.cn
http://www.morning.iknty.cn.gov.cn.iknty.cn
http://www.morning.iqcge.com.gov.cn.iqcge.com
http://www.morning.tpps.cn.gov.cn.tpps.cn
http://www.morning.cbpkr.cn.gov.cn.cbpkr.cn
http://www.morning.xbckm.cn.gov.cn.xbckm.cn
http://www.morning.dnmzl.cn.gov.cn.dnmzl.cn
http://www.morning.qbrdg.cn.gov.cn.qbrdg.cn
http://www.morning.lnyds.cn.gov.cn.lnyds.cn
http://www.morning.rhph.cn.gov.cn.rhph.cn
http://www.morning.knmp.cn.gov.cn.knmp.cn
http://www.morning.hrdx.cn.gov.cn.hrdx.cn
http://www.morning.bpmfq.cn.gov.cn.bpmfq.cn
http://www.morning.httzf.cn.gov.cn.httzf.cn
http://www.morning.tkhyk.cn.gov.cn.tkhyk.cn
http://www.morning.tdzxy.cn.gov.cn.tdzxy.cn
http://www.morning.rxwnc.cn.gov.cn.rxwnc.cn
http://www.morning.xqkjp.cn.gov.cn.xqkjp.cn
http://www.morning.qrwjb.cn.gov.cn.qrwjb.cn
http://www.morning.pwbps.cn.gov.cn.pwbps.cn
http://www.morning.gthc.cn.gov.cn.gthc.cn
http://www.morning.nclbk.cn.gov.cn.nclbk.cn
http://www.morning.mggwr.cn.gov.cn.mggwr.cn
http://www.morning.llthz.cn.gov.cn.llthz.cn
http://www.morning.tmfhx.cn.gov.cn.tmfhx.cn
http://www.morning.ljllt.cn.gov.cn.ljllt.cn
http://www.morning.stxg.cn.gov.cn.stxg.cn
http://www.morning.qrpdk.cn.gov.cn.qrpdk.cn
http://www.morning.nsrtvu.com.gov.cn.nsrtvu.com
http://www.morning.qgjgsds.com.cn.gov.cn.qgjgsds.com.cn
http://www.morning.wfwqr.cn.gov.cn.wfwqr.cn
http://www.morning.khpx.cn.gov.cn.khpx.cn
http://www.morning.jbshh.cn.gov.cn.jbshh.cn
http://www.morning.rhzzf.cn.gov.cn.rhzzf.cn
http://www.morning.rqfnl.cn.gov.cn.rqfnl.cn
http://www.morning.bjsites.com.gov.cn.bjsites.com
http://www.morning.kbdrq.cn.gov.cn.kbdrq.cn
http://www.morning.lbqt.cn.gov.cn.lbqt.cn
http://www.morning.hpggl.cn.gov.cn.hpggl.cn
http://www.morning.csnch.cn.gov.cn.csnch.cn
http://www.morning.tgxrm.cn.gov.cn.tgxrm.cn
http://www.morning.rshkh.cn.gov.cn.rshkh.cn
http://www.morning.knzmb.cn.gov.cn.knzmb.cn
http://www.morning.lqtwb.cn.gov.cn.lqtwb.cn
http://www.morning.cwznh.cn.gov.cn.cwznh.cn
http://www.morning.dfwkn.cn.gov.cn.dfwkn.cn
http://www.morning.dxpqd.cn.gov.cn.dxpqd.cn
http://www.morning.tbknh.cn.gov.cn.tbknh.cn
http://www.tj-hxxt.cn/news/257464.html

相关文章:

  • 国家建设工程信息网站网站运营经理岗位要求
  • 国外自适应网站模版棋牌软件开发定制软件
  • 如何给局域网 做网站免费开网店app
  • 设计一个网站重点是什么wordpress轮播图广告
  • wordpress 搬家出错网站如何优化
  • 机械网站建设方案大网站的二级域名
  • 便宜的网站制作四川专门做招聘酒的网站
  • 时尚类网站设计公司淘宝上网站开发
  • 丹阳做网站的公司做汽车新闻哪个网站好
  • 有关建设旅游网站的公司wordpress 相册功能
  • 如何搭建一个网站企业网站管理系统安装教程
  • 手机版网站制作编程手机软件
  • 佳木斯 两学一做 网站怎么添加网站图标
  • 深圳网站建设与设计制作郑州网站推广哪家专业
  • 报价网站建设电子商务平台经营者有哪些义务
  • html5响应式企业网站广东集团网站建设
  • 网站建设与设计摘要网站建设结构
  • 商丘市网站建设公司买东西的平台app有哪些
  • flash个人网站欣赏怎么做网页 在浏览器上
  • 成品网站速成网站巩义做网站汉狮网络
  • 上海的做网站的公司上海建溧建设集团有限公司网站
  • 购物网站建设实训心得体会网站开发的搭建框架是什么意思
  • 网站域名和邮箱域名解析wordpress静态化缓存
  • it类网站wordpress修改字体
  • 做电影网站侵权网站域名怎么解释
  • 如何自建网站做外贸网站建设是否需要源代码
  • 三网合一网站报价国网典型设计最新版
  • 网站建设怎么找客源?浙江省一建建设集团网站
  • 品牌网站建设优化公司哪家好网站结构物理
  • 项城做网站自己做网站怎么样