网页制作作业网站网上做兼职的网站
网页制作作业网站,网上做兼职的网站,seo网站推广多少钱,在百度怎么做网站在.net 4.0中增加一个延迟加载类LazyT#xff0c;它的作用是实现按需延迟加载#xff0c;也许很多人用过。一个典型的应用场景是这样的#xff1a;当初始化某个对象时#xff0c;该对象引用了一个大对象#xff0c;需要创建#xff0c;这个对象的创建时需要较长的… 在.net 4.0中增加一个延迟加载类LazyT它的作用是实现按需延迟加载也许很多人用过。一个典型的应用场景是这样的当初始化某个对象时该对象引用了一个大对象需要创建这个对象的创建时需要较长的时间同时也需要在托管堆上分配较多的空间这样可能会在初始化时变得很慢尤其是UI应用时会导致用户体验很差。其实狠多时候并不需要马上就获取大数据只是在需要时获取这种场景就很适合延迟加载了。先看看c#中LazyT如何使用的吧 class LargeObject
{public int InitializedBy { get { return initBy; } }int initBy 0;public LargeObject(int initializedBy){initBy initializedBy;Console.WriteLine(LargeObject was created on thread id {0}., initBy);}public long[] Data new long[100000000];
} class TestLazy
{LazyLargeObject lazyLargeObject null;public TestLazy(){//创建一个延迟加载对象lazyLargeObject new LazyLargeObject(InitLargeObject);}public void ReallyLoad(){//此时真正加载lazyLargeObject.Value;Console.WriteLine(lazy load big object);//do something}
}void Test()
{TestLazy t new TestLazy();t.ReallyLoad(); //这时真正延迟加载时才会打印lazy load big object
} c中目前还没有类似的LazyT延迟加载类其实延迟加载类内部用到了lamda表达式将函数封装到lamda表达式中去而不是马上求值而是在需要的时候再调用lamda表达式去求值。c11 中有lamda表达式和function正好做这个事情看看c11如何实现类似c#的LazyT延迟加载类吧。 #include boost/optional.hpp
templatetypename T
struct Lazy
{Lazy(){}template typename Func, typename... ArgsLazy(Func f, Args ... args){m_func [f, args...]{return f(args...); };}T Value(){if (!m_value.is_initialized()){m_value m_func();}return *m_value;}bool IsValueCreated() const{return m_value.is_initialized();}private:std::functionT() m_func;boost::optionalT m_value;
};templateclass Func, typename... Args
Lazytypename std::result_ofFunc(Args...)::typelazy(Func fun, Args ... args)
{return Lazytypename std::result_ofFunc(Args...)::type(std::forwardFunc(fun), std::forwardArgs(args)...);
} 再看看测试代码 struct BigObject
{BigObject(){cout lazy load big object endl;}
};struct MyStruct
{MyStruct(){m_obj lazy([]{return std::make_sharedBigObject(); });}void Load(){m_obj.Value();}Lazy std::shared_ptrBigObject m_obj;
};int Foo(int x)
{return x * 2;
}void TestLazy()
{//带参数的普通函数int y 4;auto lazyer1 lazy(Foo, y);cout lazyer1.Value() endl;//不带参数的lamdaLazyint lazyer2 lazy([]{return 12; });cout lazyer2.Value() endl;//带参数的fucntionstd::function int(int) f [](int x){return x 3; };auto lazyer3 lazy(f, 3);cout lazyer3.Value() endl;//延迟加载大对象MyStruct t;t.Load();
} 输出结果 8
12
6
lazy laod big object 这个LazyT类可以接收lamda表达式和function实现按需延迟加载。和c#的LazyT用法类似。不过还没c#中LazeT那么强大没有增加线程策略在里面目前还不想做得更复杂简单够用就行。 c11 boost技术交流群296561497欢迎大家来交流技术。转载于:https://www.cnblogs.com/qicosmos/p/3388704.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/92422.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!