- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
一些动态类型语言使用 pointer tagging作为识别或缩小所表示值的运行时类型的快速方法。一个经典的方法是将指针转换为一个适当大小的整数,并在最低有效位上添加一个标记值,这些最低有效位被假定为对齐对象的零。当需要访问对象时,标记位被屏蔽掉,整数被转换为指针,指针被正常解除引用。
这一切本身都是有序的,除了它都取决于一个巨大的假设:对齐的指针将转换为保证在正确位置具有零位的整数。
根据标准的字母是否可以保证这一点?
虽然标准部分 6.3.2.3(引用 C11 草案)说从指针到整数的转换结果是实现定义的,但我想知道的是指针算法是否符合 6.5.2.1 和 6.5 中的规则.6 有效地限制指针-> 整数转换的结果遵循许多程序已经假定的相同的可预测算术规则。 (6.3.2.3 注释 67 似乎表明这是标准的预期精神,但这并不意味着什么。)
我特别考虑的是可能分配一个大数组作为动态语言的堆的情况,因此我们讨论的指针是指向该数组元素的。我假设 C 分配的数组本身的开始可以通过一些辅助方法放置在对齐的位置(不过也一定要讨论这个)。假设我们有一个八字节的“cons cells”数组;我们能否保证指向任何给定单元格的指针将转换为一个整数,最低三位可用于标记?
例如:
typedef Cell ...; // such that sizeof(Cell) == 8
Cell heap[1024]; // such that ((uintptr_t)&heap[0]) & 7 == 0
((char *)&heap[11]) - ((char *)&heap[10]); // == 8
(Cell *)(((char *)&heap[10]) + 8); // == &heap[11]
&(&heap[10])[0]; // == &heap[10]
0[heap]; // == heap[0]
// So...
&((char *)0)[(uintptr_t)&heap[10]]; // == &heap[10] ?
&((char *)0)[(uintptr_t)&heap[10] + 8]; // == &heap[11] ?
// ...implies?
(Cell *)((uintptr_t)&heap[10] + 8); // == &heap[11] ?
(如果我理解正确,如果一个实现提供了 uintptr_t
那么 6.3.2.3 第 6 段中暗示的未定义行为是无关紧要的,对吧?)
如果所有这些都成立,那么我认为这意味着您实际上可以依赖任何转换后的指向对齐 Cell
数组元素的指针的低位来自由标记.他们 && 做到了吗?
(据我所知,这个问题是假设性的,因为通常的假设无论如何都适用于通用平台,如果您发现它不适用,您可能不想查看 C 标准以获取指导而不是平台文档;但这不是重点。)
最佳答案
This by itself is all in order, except it all hinges on one colossal assumption: that the aligned pointer will convert to an integer guaranteed to have zero bits in the right places.
Is it possible to guarantee this according to the letter of the standard?
实现可以保证这一点。将指针转换为整数的结果是实现定义的,实现可以以任何它喜欢的方式定义它,只要它符合标准的要求。
标准绝对不一般保证这一点。
一个具体的例子:我在 Cray T90 系统上工作过,它有一个在类 UNIX 操作系统下运行的 C 编译器。在硬件中,一个地址是一个 64 位字,包含一个 64 位字的地址;没有硬件字节地址。字节指针(void*
、char*
)是通过在 64 位字指针的其他未使用的高 3 位中存储 3 位偏移量在软件中实现的.
所有指针到指针、指针到整数和整数到指针的转换都只是复制表示。
这意味着指向 8 字节对齐对象的指针在转换为整数时,可以在其低 3 位中具有任何位模式。
标准中没有任何内容禁止这样做。
底线:一个像你描述的那样的方案,玩指针表示的游戏,可以工作如果你对当前系统如何表示指针做出某些假设-- 只要这些假设恰好对当前系统有效。
但是没有这样的假设可以 100% 可靠,因为标准没有说明指针是如何表示的(除了它们对于每种指针类型具有固定大小,并且表示可以被视为数组unsigned char
).
(该标准甚至不保证所有指针的大小都相同。)
关于c - 根据标准,C 中的指针标记是否未定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18578258/
注意:根据 ECMAScript5.1, section 15.1.1.3 , window.undefined 是只读的。 现代浏览器正确地实现了这一点。例如:Safari 5.1、Firefox
我用谷歌搜索,检查了所有常见的响应。这些脚本似乎顺序正确(它们在 the demo 中以相同的顺序工作)但由于某种原因,当我尝试实现它时,我得到了错误。 我有一个 paste bin用我完整的页面代码
我有以下代码: simpleExample.html: Simple example Open the Console. js/simpleExampleJS.
所以我对 typescript 很陌生。 这是我的 tsconfig.json 文件的样子, 我什至不知道那些“例子”是从哪里来的 这是我在浏览器中遇到的错误 这是我的 package.json 最佳
我被 TypeScript 错误困住了: Failed to compile. undefined TypeScript error in undefined(undefined,undefined)
我已将 onlcick 事件附加到表单的提交按钮以覆盖默认的 POST 请求,但在使其正常工作时遇到了一些问题。 我想要的是点击添加到购物车的商品,但只显示模式确认而不刷新页面。 这段代码在我的静态示
我已经完成了这个link .但是给定的解决方案并没有解决我的问题。所有经验丰富的人都建议使用 getActivty().getApplicationContext()。但我使用的是普通类(class)
我有一个应用程序,其中 webpack 配置为模块 bundler ,babel 作为我的 js 编译器。全部都在 Node 引擎上。我设置当我运行 npm run dev 时,将会发生以下流程: w
我正在尝试在浏览器中呈现网址的 JSON 数据,但它在 div 中显示为 undefined, undefined .当我将其响应放入console.log时对象及其数据出现,因此它出现在控制台和浏览
为什么我会收到 Cannot invoke an object which is possibly 'undefined'即使在我检查了 func 之后,Typescript 也会出错引用不是未定义的
我想使用airbnb的eslint修改我的代码结构。我已遵循 eslint-config-airbnb 中给出的说明。启动命令后npm run lint,结果由 'fetch' is not Defi
这个问题在这里已经有了答案: What is the consequence of this bit of javascript? (4 个答案) 关闭 9 年前。 我看到一些 jQuery 脚本嵌
我一直收到这个 pouchDB 错误,我不知道这是怎么回事。 Error: connect ENFILE 127.0.0.1:5984 - Local (undefined:undefined)
import os from os.path import abspath, dirname import sys # Set up django project_dir = abspath(dirn
在 javascript 中,要检查变量是否从未创建过,我们只需执行 if (typeof MyVariable !== "undefined"){ ... } 我想知道如何在 CoffeeScrip
我正在尝试编译 FreeLing,它使用 CMake 来检测 Boost。这是负责它的代码: find_package(Boost COMPONENTS regex filesystem thre
我收到“JQUERY 未定义”错误。你有什么想法吗(代码如下)。 $(document).ready(function() { window.print();
无论我是否将 jQuery $.ajax 调用放入 $(document).ready(function() { 中,我都会收到此错误。这是在 ASP.NET MVC .cshtml 文件上.
我正在构建的网站上遇到问题,但数据表不存在加载(在服务器上)但在本地主机(xamp)上工作正常。 Firefox 会抛出错误“$ 未定义”。 我用谷歌搜索了这些错误,我发现一个 friend 的解决方
当我在 $(document).ready 之前明确包含 jQuery 库时,我无法弄清楚为什么它仍然无法识别 jQuery 语法
我是一名优秀的程序员,十分优秀!