C++ 中的反向迭代器和负跨步迭代器,在开始之前使用一个作为哨兵

2024-06-12

In 查看 C++ 反向迭代器的另一种方式 https://devblogs.microsoft.com/oldnewthing/20211112-00/?p=105908雷蒙德·陈写道:

... C++ 语言的一个怪癖:你可以拥有一个指针 集合的“已过终点”,但不允许您拥有 集合的“开始之前的一个”指针。

我知道这可能意味着“未定义的行为”,这几乎是一个对话结束者。但我很好奇如果忽略这一规则,在现实系统中可能发生的最糟糕的情况是什么。分段错误?指针算术溢出?不必要的分页?

请记住,开头“之前”的指针(如“结束”)也不应该被引用,问题似乎只是指针trying指向它。

我能想象到的唯一可能出现问题的情况是内存位置“0”有效的系统。 但即便如此,如果是这样的话,还会有更大的问题(例如 nullptr 本身也会有问题,我猜按照惯例,环绕可能仍然有效。)

我并不是质疑实施reverse_iterator带有一个相差一的特殊代码。 我想到了这个问题,因为如果您有“跨步”迭代器的通用实现,则需要负跨步的特殊逻辑,并且会产生成本(在代码中和运行时)。

任意步幅(包括负步幅)可能会自然地出现在多维数组中。 我有一个多维数组库,原则上我总是允许负步幅,但现在我意识到,如果我允许它们,它们应该有一个特殊的代码(与正向情况不同),并且我不想暴露未定义的行为。


但我很好奇现实中可能发生的最糟糕的情况是什么 系统如果忽视这一规则。分段错误?的溢出 指针算术?不必要的分页?

浪费空间。

为了能够形成“前一”地址,您需要有可用空间。例如,如果您有一个 1k 结构,则它必须从内存开头至少 1k 开始。在内存有限的小型设备或具有分段内存的 x86 上,这可能会很棘手。

要形成“过去”的指针/迭代器,您只需要在末尾之外一个字节。由于无论如何都无法取消引用它,因此不需要为整个对象提供空间,只需可以形成地址即可。


来自评论:

在定义规则时,我们拥有带有专用地址寄存器的真实 CPU,可以根据寄存器加载时的段大小验证地址。这确保了 -1 地址会陷入困境......

https://en.wikipedia.org/wiki/Motorola_68000#Architecture https://en.wikipedia.org/wiki/Motorola_68000#Architecture

这排除了“前一个”环绕到段末尾的情况。因为如果段很小,最终的末端可能不存在。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 中的反向迭代器和负跨步迭代器,在开始之前使用一个作为哨兵 的相关文章

  • 特定于文化的日期时间字符串在平台之间不一致

    我有一个测试应用程序 允许用户从组合框中选择区域性 并在多行文本框中显示区域性特定日期 代码如下 public partial class Form1 Form public Form1 InitializeComponent comboB
  • 从文件中删除字符

    如何删除文件中的任意字符 而不是用某些字符替换 include
  • DateTimeOffset 如何处理夏令时?

    我将日程表以星期几 小时和分钟的形式存储在数据库中 当数据被读取时 我们创建一个DateTime对象下一次出现的那一天 一小时和一分钟 但我需要修改它以使其能够感知 DST 如有必要 我可以修改数据库 我知道DateTimeOffset存储
  • C# - 将“.txt”文件保存到项目根目录

    我编写了一些代码 需要我保存文本文件 但是 我需要将其保存到我的项目根目录 以便任何人都可以访问它 而不仅仅是我 这是有问题的方法 private void saveFileToolStripMenuItem Click object se
  • 允许结构字段溢出到下一个字段

    考虑以下简单示例 struct attribute packed int code 1 int place holder 100 s void test int n int i for i 0 i lt n i s code i 1 for
  • PS3 上的 Mono 开发资源

    我一直在考虑冒险在我的 Playstation 3 上安装 Linux 由于 C 是我当前选择的语言 所以下一个合乎逻辑的步骤是安装 Mono 我做了一些研究发现http psubuntu com wiki InstallationInst
  • DateTime.Now 相当于 TimeOnly 和 DateOnly?

    NET 6 C 10 推出TimeOnly and DateOnly结构体 分别表示仅时间和日期 老好人DateTime结构总是有一个Now静态属性将为您提供当前日期和时间 我期待着两者TimeOnly and DateOnly结构具有类似
  • 在 std::string 中,是否可以在不使用循环的情况下找到一组字符串中的第一个字符串?

    在 std string 中 是否可以在不使用循环的情况下找到一组字符串中的第一个字符串 E g std string str aaa bbb ccc ddd eee fff ggg std vector
  • C# 中任务的 System.InvalidOperationException

    我试图通过使用任务 Parallel foreach 使我的代码更快 这是我更新的代码 int intImageW intImageH Bitmap bmpDest new Bitmap 1 1 DateTime creationTime
  • C++ 限制语义

    我正在更新性能关键库以使用限制 如 g 和 MSVC 在 C 11 中使用关键字实现的那样 restrict 这似乎是最标准的扩展 所以我将使用restrict and restrict可以互换 restrict是一个 C99 关键字 但编
  • std::ofstream,写入前检查文件是否存在

    我正在实现文件保存功能Qt使用 C 的应用程序 我正在寻找一种方法来检查所选文件在写入之前是否已存在 以便我可以向用户提示警告 我正在使用一个std ofstream我并不是在寻找Boost解决方案 这是我最喜欢的隐藏功能之一 我随身携带以
  • T[] 和 T[*,*] 有什么区别?

    我的谷歌柔术让我失望了 问题在标题中 有什么区别T and T 我正在寻找 2 2 1 2 部分的答案 外行 或超级架构师 的简单英语解释和示例代码 链接到此区别的正式文档 额外奖励 指向定义此内容的 C 4 规范中的小节和页码 它不在第
  • 将固定长度的数据从 std::istream 复制到字符串

    我想将固定长度的数据从 std istream 复制到字符串 std istream operator gt gt std istream is LogMsg msg read in 4 bytes a uint32 t that desc
  • 如何正确并行化严重依赖 I/O 的作业

    我正在构建一个必须处理大量数据的控制台应用程序 基本上 应用程序从数据库获取引用 对于每个引用 解析文件的内容并进行一些更改 这些文件是 HTML 文件 该过程正在使用 RegEx 替换进行繁重的工作 查找引用并将其转换为链接 然后结果存储
  • 如何将进程窗口置于前面?

    我在 Form1 中有这个按钮点击代码 private void DriverVerifier Click object sender EventArgs e if MessageBox Show Are you Sure you want
  • 使用 MVC3 C# 进行分页的最简单方法?

    在 MVC3 C 中有一个网站项目 我从数据库中检索信息并在我的视图中以表格形式呈现 我想使用分页来每页最多显示五行 一直在互联网上寻找教程 但它们似乎都非常先进 可以实现这一目标 使用 MVC3 进行分页的最简单方法是什么 看图片左下角就
  • .Net 和 Java 之间的 SSL 套接字,具有客户端身份验证

    我正在尝试在 NET 和 Java 之间创建 SSL 套接字服务器 客户端 在这种情况下 我的 SSL 套接字服务器将在 net 中运行 客户端在 Linux 下以 Java 运行 我的问题是在握手期间连接失败 特别是当服务器向客户端请求证
  • XPS 文件中打印的重复图像

    首先 我想指出 我已将此作为错误向 Microsoft 提出 但他们目前不愿意修复它 我正在寻找一种解决方法或更好的方法来实现我想要做的事情 因为我们的客户认为这是一个相当重要的问题 The code 主窗口 xaml
  • 使用 SerialPort 禁用 EOF (0x1A) [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我知道还有
  • 获取 AES 256 Crypto++ 中的十六进制加密字符串

    我正在尝试在 MS Visual Studio 中使用 Crypto 实现 AES 256 算法 操作系统是Windows 7 64位 我需要以十六进制字符串形式提供密钥 以字符串形式提供密码 最后我希望加密的字符串也是十六进制字符串 这是

随机推荐

  • Symfony Finder 忽略以点开头的文件

    我使用 Finder 发送假脱机电子邮件 但自动名称生成器会在文件名中添加点 有时它们会出现在文件的开头 似乎查找器无法获取具有该名称的文件 那么这些文件是隐藏的 有人经历过这种行为吗 有什么建议如何使用查找器来查找隐藏文件吗 Thx 刚刚
  • 类名中的方括号是什么意思?

    I saw here http www position absolute com articles jquery form validator because form validation is a mess 类名中使用的方括号
  • 如何在 selenium webdriver 中将网络浏览器从 Firefox 更改为 Chrome/Opera/IE/Safari?

    如何将浏览器从 firefox 更改为在 selenium webdriver 中工作的 Chrome Opera IE 请指导步骤以及代码片段 如果您对上述任何浏览器有答案 请回复 我读了很多这方面的内容 但无法正确链接 首先 您需要将正
  • Python lmfit 在加权拟合后将卡方减小得太小

    我正在 Python 2 7 中运行 fitlmfit通过以下代码使用一些测试数据 我需要权重为1 y 使用 Leven Marq 例程 我已经定义了权重并在这里使用它们 from future import division from n
  • 删除 android ListView 的底部分隔线

    我有固定的高度ListView 它在列表项之间有分隔线 但它还在最后一个列表项之后显示分隔线 有没有办法在最后一项之后不显示分隔线ListView 只需添加android footerDividersEnabled false 到您的 Li
  • Monolog:如何捕获所有错误和异常

    我错过了一些非常明显的东西 如何让 monolog 记录所有 php 错误 php 用户错误和异常 在使用 monolog 之前 我编写了自己的函数并将其传递给set error handler register shutdown func
  • 确定是否单击了 Google Chrome 打印预览中的打印/取消按钮

    我一直在使用下面的代码打印我的页面 window print 下图是 Google Chrome 浏览器中的打印预览的样子 它有两个主要按钮 print and cancel 我想知道用户是否点击了print or cancel纽扣 我所做
  • 合并多边形的高效算法

    我有一个多边形列表 在这个列表中 一些多边形重叠 或者接触其他多边形 我的任务是合并所有相互重叠或接触的多边形 我有一个union执行此操作的方法 做到这一点最有效的方法是什么 我目前能想到的是循环遍历多边形列表 检查合并列表以查看该多边形
  • 使用 kaminari 查找给定记录的页面

    Ruby on Rails 3 项目 更新记录后 我们返回所有记录的索引 不是更新记录的视图 该索引通过 Kaminari 进行分页 我们如何返回到包含更新记录的索引页面 Java JPA Hibernate 有类似的问答使用 JPA Hi
  • VBA 使用 Like 运算符删除行

    简单的事情并不简单 我试图根据具有以 2L 开头的数据的特定列删除行 所以我写了这段代码 LastRow可以理解 Sub Cleanup For i 1 To LastRow If Range F i Like 2L Then Rows i
  • 不要覆盖 Azure Blob 存储

    我有一种将文件添加到 Azure Blob 存储的方法 问题是我试图指定一个条件 在该条件下它不会覆盖 blob 而只是添加到其中 我正在尝试使用参数访问条件 但是 VS 说这个方法不能采用两个参数 async void archiveNe
  • 是否可以让 cmake 构建文件(CMakeLists.txt)不在 CLion 的根目录中

    是否可以让 cmake 构建文件 CMakeLists txt 不在 CLion 的根目录中 我目前正在开发的项目中 cmake 构建文件不在 CLion 项目的根目录中 在 out Debug 目录中 我希望 CLion 打开该项目的根目
  • 图形批量API

    这是我在 stackoverflow 上的第一篇文章 我正在使用 Facebook Graph Batch API 一次请求多个用户的 Feed 更新 但我真的不知道如何进行适当的错误处理 下面的例子应该说明我的问题 批量请求 user1
  • HttpURLConnection.getResponseCode() 冻结执行/不会超时

    我正在编写一个 Android 应用程序 它连接到受密码保护的 cPanel 服务器 Apache 2 2 22 页面 当身份验证凭据正确时 我的连接没有问题 但是 当凭据不正确时 我的 Android 应用程序似乎会冻结在HttpURLC
  • 有什么办法可以让这个 C# 代码更快吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在读取一个大文件 X12 并解析其中的信息 我有两个瓶颈功能 我似乎无法解决 read line 和 get element 有什
  • 如何从嵌套 FormGroup 添加/删除 FormControl

    candidateForm FormGroup constructor private fBuilder FormBuilder ngOnInit this candidateForm this fBuilder group fname n
  • iphone - UISearchBar 上的搜索按钮

    我有一个使用 UISearchBar 的搜索功能 它是即时发生的 所以我认为用 完成 替换键盘上的 搜索 按钮会更明显 有没有办法做到这一点 thanks 您可以更改keyboardTypeUISearchBar 对象的属性 然而 没有办法
  • 如何使用平台调用编组 void*

    我需要从 dll 中包含的 C api 调用函数 函数原型如下 int func char name void value 其中指针值的内容可以引用依赖于传递的名称的任何类型 我不确定如何设置 Dll 输入端口以正确编组此 void 我一直
  • 缓存友好的矩阵移位功能

    我想将二维方阵的第一行移到最后一行 所以如果我有一个像A这样的矩阵 我想要得到B 我可以使用两个简单的 for 循环来做到这一点 例如 void shift int M int N int A M N int i j temp for i
  • C++ 中的反向迭代器和负跨步迭代器,在开始之前使用一个作为哨兵

    In 查看 C 反向迭代器的另一种方式 https devblogs microsoft com oldnewthing 20211112 00 p 105908雷蒙德 陈写道 C 语言的一个怪癖 你可以拥有一个指针 集合的 已过终点 但不