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

行业网站模版网页设计培训公司哪家好

行业网站模版,网页设计培训公司哪家好,苏州关键词seo排名,wordpress点击量设置有时候我们觉得#xff0c;C的术语仿佛是要故意让人难以理解似的。 这里就有一个例子#xff1a;请说明new operator 和operator new 之间的差异#xff08;译注#xff1a;本书所说的new operator#xff0c;即某些C教程如C Primer 所谓的new expression) 当你写出这样…有时候我们觉得C的术语仿佛是要故意让人难以理解似的。 这里就有一个例子请说明new operator 和operator new 之间的差异译注本书所说的new operator即某些C教程如C Primer 所谓的new expression) 当你写出这样的代码 string *ps new string(Memory Management); 你所使用的 new 是所谓的new operator。 这个操作符是由语言内建的就像sizeof那样不能被改变意义总是做相同的事情。 它的动作分为两方面。 第一它分配足够的内存用来放督某类型的对象。以上例而言它分配足够放置一个string 对象的内存。第二它调用一个constructor为刚才分配的内存中的那个对象设定初值。 new operator总是做这两件事无论如何你不能够改变其行为。 你能够改变的是用来容纳对象的那块内存的分配行为。也就是上面的第一步 new operator 调用某个函数执行必要的内存分配动作你可以重写或重载那个函数改变其行为。这个函数的名称叫做operator new。头昏了吗真的我说的是真的。 函数operator new 通常声明如下 void * operator new(size_t size); 其返回值类型是void*。此函数返回一个指针指向一块原始的、未设初值的内存如果你喜欢可以写一个新版的operator new在其返回内存指针之前先将那块内存设定初值。只不过这种行为颇为罕见就是了。 函数中的size_t 参数表示需要分配多少内存。 你可以将operator new 重载加上额外的参数但第一参数的类型必须总是 size_t如何撰写 operator new相关信息请参考条款E8~E10 吸中协从不想到要直接调用operator new但如果你要你可以像调用任何其他函数一样地调用它 void *rawMemory operator new(sizeof(string)); 这里的operator new将返回指针指向一块足够容纳一个string对象的内存。 和malloc一样operator new的唯一任务就是分配内存。它不知道什么是constructors, operator new只负责内存分配。 取得 operator new 返回的内存并将之转换为一个对象是new operator 的责任。 当你的编译器看到这样一个句子 string *ps new string(Memory Management); 它必须产生一些代码或多或少会反映以下行为见条款E8和条款E10以及发表于C/C Users Journal, April1998 的文章《Counting Objects inC》中的方块内容 void *memory  operator new(sizeof(string));//取得原始内存raw memory。用来放置一个string对象。call string::string(Memory Management)//将内存中的对象初始化。 on *memorystring *ps static_caststring*(memory);//让ps指向新完成的对象。注意上述第二步骤涉及“调用一个constructor”身为程序员的你没有权力这么做。 然而你的编译器百无禁忌可以为所欲为。这就是为什么如果你想要做出一个heap-based object一定得使用new operator 的原因你无法直接调用“对象初始化所必需的constructor” 尤其它可能得为重要成分vtbl设定初值见条款24。 Placement new 有时候你真的会想直接调用一个constructor。 针对一个已存在的对象调用其constructor 并无意义因为 constructors 用来将对象初始化而对象只能被初始化一次。 但是偶尔你会有一些分配好的原始内存你需要在上面构建对象。有一个特殊版本的operator new称为placement new允许你那么做。 下面示范如何使用 placement new: class Widget { public: widget(int widgetsize); //... }widget * constructWidgetInBuffer (void *buffer, int widgetSize) { return new (buffer) Widget(widgetsize); } 此函数返回指针指向一个widget object它被构造于传递给此函数的一块内存缓冲区上。 当程序运行到shared memory 或memory-mapped I/O这类函数可能是有用的因为在那样的运用中对象必须置于特定地址或是置于以特殊函数分配出来的内存上条款4列有placement new的另一个运用实例 在 constructWidgetInBuffer 函数内部唯一一个表达式是 new (buffer) Widget(widgetSize) 乍见之下有点奇怪其实不足为奇这只是new operator 的用法之一其中指定一个额外自变量buffer)作为 new operator “隐式调用operator new”时所用。 于是被调用的operator new除了接受“一定得有的size_t 自变量”之外还接受了一个void*参数指向一块内存准备用来接受构造好的对象。这样的operator new 就是所谓的placement new看起来像这样: void * operator new (size_t,void *location)//注意size_t后面没名字 { return location; } 似乎比你预期得更简单但这便是placement new必须做的一切。 毕竟operator new的目的是要为对象找到一块内存然后返回一个指针指向它。 在placement new的情况下调用者已经知道指向内存的指针了因为调用者知道对象应该放在哪里。因此placement new 唯一需要做的就是将它获得的指针再返回。 至于没有用到但一定得有的size_t参数之所以不赋予名称为的是避免编译器发出“某物未被使用”的警告见条款6Placement new 是C标准程序库见条款E49的一部分。 欲使用 placement new你必须用#include new。如果你的编译器尚未支持新式头文件名称的话见条款E49)就用#includenew.h。 花几分钟回头想想 placement new我们便能了解 new operator 和 operator new之间的关系两个术语虽然表面上令人迷惑概念上却十分直接易懂。 如果你希望将对象产生于heap请使用 new operator。它不但分配内存而且为该对象调用一个constructor。如果你只是打算分配内存请调用 operator new那就没有任何constructor会被调用。如果你打算在heap objects 产生时自己决定内存分配方式请写一个自己的 operator new并使用 new operator它将会自动调用你所写的operator new。如果你打算在已分配并拥有指针的内存中构造对象请使用placement new(若想更深入地了解new和delete请见条款E7及发表于C/CUsers Journal, April1998的文章《Counting Objects in C》 删除Deletion与内存释放Deallocation 为了避免resource leaks资源泄漏每一个动态分配行为都必须匹配一个相应但相反的释放动作。函数operator delete 对于内建的delete operator就好像operator new对于new operator 一样。当你写出这样的代码 string *ps; //。。。 delete ps;// 使用 delete operator。 你的编译器必须产生怎样的代码 它必须既能够析构 ps所指对象又能够释放被该对象占用的内存。 内存释放动作是由函数operator delete 执行通常声明如下: void operator delete(void *memoryToBeDeallocated); 因此下面这个动作 delete ps; 会造成编译器产生近似这样的代码 ps-~string();// 调用对象的dtoroperator。operator delete (ps);//释放对象所占用的内存。 这里呈现的一个暗示就是如果你只打算处理原始的、未设初值的内存应该完全回避new operator 和 delete operators改调用operator new取得内存并以operator delete 归还给系统: void *bufferoperator new(50*sizeof(char));//分配足够的内存放置50个 chars没有调用任何ctorsoperator delete(buffer);//释放内存没有调用任何dtors。 这组行为在C中相当于调用malloc和free。 如果你使用placement new在某内存块中产生对象你应该避免对那块内存使用delete opcrator.因为 delete operator会调用 operator delete来释放内存但是该内存内含的对象最初并非是由 operator new分配得来的。 毕竟placemen new只是返回它所接收的指针而已谁知道那个指针从哪里来呢所以为了抵消该对象的constructor的影响你应该直接调用该对象的destructor: //以下函数用来分配及释放 shared memory 中的内存。 void* mallocshared(size_t size); void freeShared(void *memory);void*sharedMemorymallocShared(sizeof(Widget));//和先前相同运用Widget*pwconstructWidgetInBuffer(sharedMemory, 10); // placement new。 //.. delete pw;//无定义因为sharedMemory 来自mallocshared不是来自 operator new。pw-~Widget(); //可析构 pw 所指的widget 对象 //但并未释放widget占用的内存。freeShared(pw); //可释放 pw所指的内存, //不调用任何 destructor。 如此例所示如果交给placement new 的原始内存raw memory本身是动态分配而得通过某种非传统做法那么你最终还是得释放那块内存以免遭受内存泄漏memory leak)之苦请参考文章《Counting Objects inC》之中的方块内容其中对所谓的“placement delete”有些介绍。 数组Arrays 目前为止一切都好但我们还有更远的路要走。截至目前我们考虑的每件事情都只在单一对象身上打转。面对数组怎么办下面会发生什么事情 string *ps new string[10);//分配一个对象数组 上述使用的new 仍然是那个new operator但由于诞生的是数组所以new operator的行为与先前产生单一对象的情况略有不同。 是的内存不再以operator new分配而是由其“数组版”兄弟一个名为operator new[]的函数负责分配通常被称为“aray new”。 和operator new一样operator new[]也可以被重载。这使你得夺取数组的内存分配权就像你可以控制单一对象的内存分配一样不过条款E8对此有些警告。 operatornew[]是相当晚的时候才加入C的一个特性所以你的编译器或许尚未支持它。 如果是这样全局operator new会被用来为每个数组分配内存一不论数组中的对象类型是什么。 在这样的编译器下定制“数组内存分配行为”很困难因为你得改写全局版的 operator new才行。这可不是件容易的工作。 默认情况下全局版的operator new负责程序中所有的动态内存分配所以其行为的任何改变都可能带来剧烈而普遍的影响。此外全局版本的operator new其正规形式的型构eignature)我的意思是只有唯一size_t参数的那个见条款E9只有一个所以如果你决定声称它为你所拥有你的软件便立刻不容于任何做了相同决定的程序库见条款 27。 多方考虑之下如果你面对的是尚未支持 。perator new[]的编译器定制“数组内存管理行为”往往不是个理想的决定。 “数组版”与“单一对象版”的newoperator的第二个不同是它所调用的constructor数量。数组版new operator 必须针对数组中的每个对象调用一个constructor: string *ps //调用operator new[]以分配足够容纳new string[10];//10个 string 对象的内存然后 //针对每个元素调用 string default ctor。 同样道理当delete operator 被用于数组它会针对数组中的每个元素调用其 destructor然后再调用 operator delete[]释放内存: delete [] ps; //为数组中的每个元素调用 string dtor. 然后调用 operator delete[]以释放内存。 就好像你可以取代或重载 operator delete一样你也可以取代或重载operator delete[]。不过两者的重载有着相同的限制。请你找一本好的C教程,查阅其细节。说到好的C教程本书p285列有我的一份推荐名单。 现在你有了完整的知识。 new operator 和delete operator 都是内建操作符,无法为你所控制但是它们所调用的内存分配/释放函数则不然。 当你想要定制new operator 和 delete operator的行为记住你其实无法真正办到。你可以修改它们完成任务的方式至于它们的任务已经被语言规范固定死了。
http://www.w-s-a.com/news/569356/

相关文章:

  • 手机版网站怎样做推广如何用asp做视频网站
  • dede 网站打开慢七牛云 微信 打开 wordpress
  • 哪里网站建设公司比较好教育培训类网站模板
  • 中国建设银行官网首页网站wordpress小工具不能完全显示
  • 企业网站的开发流程是什么网站开发怎么销售
  • 现在网站还用asp做男科医院哪家好一些
  • 服装设计网站素材郑州汉狮做网站网络公司
  • 宜州做网站做仿制网站
  • 中山营销型网站厦门工程建设招聘信息网站
  • 网站开发 外包空心找回微信
  • 长沙市网站推广多少钱网站开发流程图和介绍
  • 网站后缀net施工企业自建自用的工程可以不进行招标是否正确
  • 鄂尔多斯市住房和城乡建设厅网站帮别人做网站赚钱6
  • 宜选科技就是帮人做网站动漫制作专业主修课程
  • 怎么做网站免费的教程温州捷创网站建设
  • 做免费推广的网站有哪些深圳华强北最新消息
  • 电子商务网站建设规划开题报告桂林漓江景区游玩攻略
  • 程序员参与洗钱网站建设做视频网站需要多少钱
  • 网站建设背景是什么企业邮箱怎么写
  • 山东省建设资格中心网站iis wordpress安装教程
  • 做的网站 显示乱码怎么做微信小程序平台
  • 怎样建设打字网站怎样增加网站浏览量
  • 网站建设方案的征求意见网站主机免备案
  • 共享农业网站建设郑州市建网站
  • 成都网站建设四川冠辰网站建设带会员系统的网站模板
  • 水果网站建设方案书wordpress get_the_category
  • 第一ppt网站官网买域名价格
  • 网站 报价单自己做的网站如何上传
  • 天津网站建立辽宁建设工程信息网2017年定额人工费系数
  • 柳州网站优化搜索引擎优化方法案例