0

0

技术文被diss了

看不見的法師

看不見的法師

发布时间:2025-07-19 11:48:20

|

819人浏览过

|

来源于php中文网

原创

你好,雨乐!

昨晚(2022年5月10日)19:33,我突然收到了一条文章评论。

技术文被diss了当时我心里一惊,怀疑是我上篇文章中的代码在从编辑器复制到文章时出现了错误。然而,我觉得这不太可能,因为每篇文章的代码都是在机器上运行验证后才发布的,所以出错的概率应该很低。

但既然有读者提出了问题,我必须认真验证一番。遗憾的是当时我在地铁上,无法使用电脑进行实操验证,于是我使用了一个在线编辑器,编写了一个简单的代码来进行测试:

技术文被diss了测试结果显示没有问题。尽管如此,既然有读者反馈说在使用中存在问题,这应该不是无中生有,于是我找到了几位朋友在线帮忙查看。

这个:

技术文被diss了这个:

技术文被diss了还有这个:

技术文被diss了从大家的反馈来看,仍然无法确定问题所在,大家都只是觉得可能有问题。

终于回到家后,趁着孩子在玩,我赶紧拿出电脑,把文章中的代码重新复制、编译、运行,一切正常。这就奇怪了,难道路径不同导致结果不同吗?

环境不同?我突然想起群里一位同学之前私聊过我,说他运行文章中的代码时会崩溃。

技术文被diss了因为之前忙于工作,我没有仔细了解。在咨询了这位同学后,他回复说是在Windows下编译运行的。

多奥淘宝客程序API免费版 F8.0
多奥淘宝客程序API免费版 F8.0

多奥淘宝客程序免费版拥有淘宝客站点的基本功能,手动更新少,管理简单等优点,适合刚接触网站的淘客们,或者是兼职做淘客们。同样拥有VIP版的模板引擎技 术、强大的文件缓存机制,但没有VIP版的伪原创跟自定义URL等多项创新的搜索引擎优化技术,除此之外也是一款高效的API数据系统实现无人值守全自动 化运行的淘宝客网站程序。4月3日淘宝联盟重新开放淘宝API申请,新用户也可使用了

下载

由于本地没有Windows环境,我找人帮忙在VS上执行了代码,结果如下:

技术文被diss了在Windows上出现了错误,看来该读者是在Windows环境下执行这段代码的。

既然在Windows和Linux上的运行结果不同,有必要深入研究源码实现。

MSVC实现了vector::reserve(),实现如下:

代码语言:javascript代码运行次数:0运行复制```javascript _CONSTEXPR20 void reserve(_CRT_GUARDOVERFLOW const size_type _Newcapacity) { // ... _Reallocate_exactly(_Newcapacity); // ... }

<code>
从上述代码来看,我们只需要关注_Reallocate_exactly的实现即可,于是继续查看该函数的实现,如下:
<p>代码语言:javascript代码运行次数:0<svg fill="none" height="16" viewbox="0 0 16 16" width="16" xmlns="<a href="https://www.php.cn/link/c9041cfd2a40932691855abd98fd219a">http://www.w3.org/2000/svg"><path</a> d="M6.66666 10.9999L10.6667 7.99992L6.66666 4.99992V10.9999ZM7.99999 1.33325C4.31999 1.33325 1.33333 4.31992 1.33333 7.99992C1.33333 11.6799 4.31999 14.6666 7.99999 14.6666C11.68 14.6666 14.6667 11.6799 14.6667 7.99992C14.6667 4.31992 11.68 1.33325 7.99999 1.33325ZM7.99999 13.3333C5.05999 13.3333 2.66666 10.9399 2.66666 7.99992C2.66666 5.05992 5.05999 2.66659 7.99999 2.66659C10.94 2.66659 13.3333 5.05992 13.3333 7.99992C13.3333 10.9399 10.94 13.3333 7.99999 13.3333Z" fill="currentcolor"></path></svg>运行<svg fill="none" height="16" viewbox="0 0 16 16" width="16" xmlns="<a href="https://www.php.cn/link/c9041cfd2a40932691855abd98fd219a">http://www.w3.org/2000/svg"><path</a> clip-rule="evenodd" d="M4.5 15.5V3.5H14.5V15.5H4.5ZM12.5 5.5H6.5V13.5H12.5V5.5ZM9.5 2.5H3.5V12.5H1.5V0.5H11.5V2.5H9.5Z" fill="currentcolor" fill-rule="evenodd"></path></svg>复制<code>javascript _CONSTEXPR20 void _Reallocate_exactly(const size_type _Newcapacity) {        // set capacity to _Newcapacity (without geometric growth), provide strong guarantee        auto& _Al         = _Getal();        auto& _My_data    = _Mypair._Myval2;        pointer& _Myfirst = _My_data._Myfirst;        pointer& _Mylast  = _My_data._Mylast;        const auto _Size = static_cast<size_type>(_Mylast - _Myfirst);        const pointer _Newvec = _Al.allocate(_Newcapacity);        // ...    }</size_type></code>

我们注意到vector::reserve中获取了_Myfirst和_Mylast(注意,此处_Myfirst == _Mylast),然后调用allocator.allocate()函数分配了内存,那么继续看vector::operator[]的实现,如下:

代码语言:javascript代码运行次数:0运行复制javascript _NODISCARD _CONSTEXPR20 const _Ty& operator[](const size_type _Pos) const noexcept / strengthened / { auto& _My_data = _Mypair._Myval2;#if _CONTAINER_DEBUG_LEVEL > 0 _STL_VERIFY( _Pos (_My_data._Mylast - _My_data._Myfirst), "vector subscript out of range");#endif // _CONTAINER_DEBUG_LEVEL > 0 return _My_data._Myfirst[_Pos]; }

<code>
我们注意到上面一句代码<code>_Pos < (_My_data._Mylast - _My_data._Myfirst)</code>,在前面内容中,有提到<code>_Myfirst == _Mylast</code>,因此该处代码不成立,所以引发了崩溃,这就是Windows下运行结果出错的原因。</p><p>GNU实现gnu下vector<t>::reserve()实现如下:</t></p><p>代码语言:javascript代码运行次数:0<svg fill="none" height="16" viewbox="0 0 16 16" width="16" xmlns="<a href="https://www.php.cn/link/c9041cfd2a40932691855abd98fd219a">http://www.w3.org/2000/svg"><path</a> d="M6.66666 10.9999L10.6667 7.99992L6.66666 4.99992V10.9999ZM7.99999 1.33325C4.31999 1.33325 1.33333 4.31992 1.33333 7.99992C1.33333 11.6799 4.31999 14.6666 7.99999 14.6666C11.68 14.6666 14.6667 11.6799 14.6667 7.99992C14.6667 4.31992 11.68 1.33325 7.99999 1.33325ZM7.99999 13.3333C5.05999 13.3333 2.66666 10.9399 2.66666 7.99992C2.66666 5.05992 5.05999 2.66659 7.99999 2.66659C10.94 2.66659 13.3333 5.05992 13.3333 7.99992C13.3333 10.9399 10.94 13.3333 7.99999 13.3333Z" fill="currentcolor"></path></svg>运行<svg fill="none" height="16" viewbox="0 0 16 16" width="16" xmlns="<a href="https://www.php.cn/link/c9041cfd2a40932691855abd98fd219a">http://www.w3.org/2000/svg"><path</a> clip-rule="evenodd" d="M4.5 15.5V3.5H14.5V15.5H4.5ZM12.5 5.5H6.5V13.5H12.5V5.5ZM9.5 2.5H3.5V12.5H1.5V0.5H11.5V2.5H9.5Z" fill="currentcolor" fill-rule="evenodd"></path></svg>复制<code>javascript template<typename _alloc="" _tp="" typename="">     void     vector<_tp _alloc="">::     reserve(size_type __n)     {       if (__n > this->max_size())     __throw_length_error(__N("vector::reserve"));       if (this->capacity() < __n)         {           const size_type __old_size = size();           pointer __tmp = _M_allocate(__n);           this->_M_impl._M_finish =           _GLIBCXX_MAKE_MOVE_ITERATOR(this->_M_impl._M_start),           _GLIBCXX_MAKE_MOVE_ITERATOR(this->_M_impl._M_finish));           std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,             _M_get_Tp_allocator());           _M_deallocate(this->_M_impl._M_start,             this->_M_impl._M_end_of_storage             - this->_M_impl._M_start);           this->_M_impl._M_start = __tmp;           this->_M_impl._M_finish = __tmp + __old_size;           this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n;         }     }     }</_tp></typename></code>

从上述实现可以看出,reserve()函数分配了所需的内存空间,并且与MSVC一样的是经过reserve之后_M_start == _M_finish,这是因为__old_size为0。

我们继续查看vector::operator[]的实现,如下所示:

代码语言:javascript代码运行次数:0运行复制javascript const_reference operator[](size_type n) const { return *(this->_M_impl._M_start + n); }

<code></p><p>与MSVC的operator实现不同的是,gnu的实现中,直接通过首地址+n来进行元素访问(而没有进行size判断),因为内存已经完成分配,所以这样操作是没问题的,这就是Linux环境下执行没问题的原因。</p><p>结语本想与该读者继续私聊,无奈已经被取消关注?。</p><p>昨晚,我也对读者提出的问题进行了反思。虽然代码在Linux环境下运行没有问题,但仍然会有一部分Windows的读者认为代码有误。因此,在未来的文章中,如果涉及到代码,我会尽量考虑编译环境的因素。</p><p>今天的文章就到这里,我们下期见!</code>

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

558

2023.09.20

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

186

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

130

2025.11.27

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1431

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1164

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

833

2023.08.01

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

461

2023.08.02

windows无法访问共享电脑
windows无法访问共享电脑

在现代社会中,共享电脑是办公室和家庭的重要组成部分。然而,有时我们可能会遇到Windows无法访问共享电脑的问题。这个问题可能会导致数据无法共享,影响工作和生活的正常进行。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2361

2023.08.08

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

23

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 10.3万人学习

Excel 教程
Excel 教程

共162课时 | 20.4万人学习

PHP基础入门课程
PHP基础入门课程

共33课时 | 2.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号