问题标签 [pointer-aliasing]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
3187 浏览

python - 在python中创建部分列表的别名

有没有办法在 python 中为列表的一部分获取别名?

具体来说,我希望发生这种情况:

但我得到的是:

0 投票
2 回答
432 浏览

c - 严格的别名和通过 char* 写入 int

在一个旧程序中,我通过分配一个无符号字符数组将数据结构序列化为字节,然后通过以下方式转换整数:

(其中,p是要存储的值)。unsigned char*value

这工作正常,除非在 Sparc 上编译时由于访问内存对齐不正确而触发异常。这很有意义,因为具有不同大小的数据元素p很快就会变得不对齐,并在用于存储 int 值时触发错误,其中底层 Sparc 指令需要对齐。

这很快被修复(通过逐字节将值写入 char 数组)。但是我对此有点担心,因为多年来我在许多程序中都使用了这种结构而没有问题。但很明显,我违反了一些 C 规则(严格别名?),虽然这种情况很容易被发现,但由于优化编译器等,这些违规行为可能会导致其他类型的未定义行为更加微妙。我也有点困惑,因为我相信这些年来我在很多 C 代码中都看到过这样的结构。我正在考虑将硬件交换的数据结构描述为结构的硬件驱动程序(当然使用 pack(1)),并将它们写入硬件寄存器等。所以这似乎是一种常用技术。

所以我的问题是,以上到底违反了哪些规则,以及实现用例的正确 C 方法是什么(即将数据序列化为无符号字符数组)。当然,可以为所有函数编写自定义序列化函数,逐字节写出,但这听起来很麻烦,效率也不高。

最后,是否可以通过违反此别名规则来预期一般的不良影响(对齐问题等)?

0 投票
1 回答
50 浏览

java - 将节点添加到 LinkedList 时,幕后会发生什么(堆、堆栈等)?

编辑:我在 youtube 上搜索了关于链表和堆的内容,垃圾收集器何时擦除temp?我知道它应该,但看不到在哪里。

我很难理解它。直觉上我会写

我知道这是不对的,但我觉得我需要了解对象和地址的情况才能明白这一点......

第一行:我创建了一个 temp,并将它指向同一个地址 _head 点
秒行:现在 head 指向地址节点点,(node.next 等于 head.next)
第三行:现在 node.next 变为 temp..
我对吗

0 投票
1 回答
100 浏览

python - NumPy 是否正确处理复数运算的 1:1 别名?

ab是不相交的 1D complexNumPy 数组,我做numpy.multiply(a, b, b). 保证包含与我通过 获得的值相同的值
吗?bb[:] = numpy.multiply(a, b)

我实际上并没有能够产生不正确的结果,但我不知道我是否只是对我的特定编译或平台感到幸运,或者我是否真的可以依赖它,因此这个问题。

请注意,对于float(即实数),答案显然是肯定的,因为合理的实现不会使其失败,但是对于复数,通过写入实部然后读取虚部:

0 投票
1 回答
69 浏览

python - 使用别名遍历列表一次(python)

假设我有一个名为 的列表list,它由布尔值组成。还说我有一些(有效的)索引i,这是list我想要切换值的索引。

目前,我有:list[i] = not list[i]

但我的问题是,这不是迭代list两次吗?如果是这样,有没有办法通过别名设置临时值以仅遍历列表一次?

我尝试了以下方法:

但这对我不起作用,它只切换了 的值temp,而不是 的值list[i]

0 投票
0 回答
68 浏览

c++ - 这种混叠的来源可能是什么?

我正在手动对 3D 图像进行光线追踪。我注意到,离 3D 图像越远,锯齿就越大。

这个 3D 图像基本上是斯坦福龙的体素化表示。我已将体积中心放置在原点(对角线在 (0,0,0) 处交叉),这意味着其中一个角位于 (-cube_dim, -cube_dim, -cube_dim),另一个位于 (cube_dim, cube_dim,立方体_dim)。

在近距离,图像很好:

在此处输入图像描述

(您在此处看到的次要“混叠”是由于我进行了光线行进算法,这不是我担心的混叠,这是预期的并且可以接受)

但是,如果我们离得足够远,就会开始看到一些混叠:(在此处输入图像描述 这是一种完全不同的混叠)

用于生成图像的片段着色器是这样的:

理解算法

首先,我们根据屏幕坐标创建光线(我们使用标准光线追踪技术,焦距为 1/tan(角度))。

然后我们在相机的当前位置开始射线

我们检查光线与包含我们对象的盒子的交集(我们基本上假设我们的 3D 纹理是场景中的一个大立方体,我们检查是否击中它)。

如果我们不击中它,我们将丢弃该片段。如果我们真的击中它并且我们在外面,我们会沿着射线移动,直到我们到达盒子的表面。如果我们击中它并在里面,我们就会留在原地。

在这一点上,我们保证我们的光线的位置在盒子里面。

现在我们沿着射线移动一小段直到我们找到一个非零值或者我们到达盒子的末端。

0 投票
1 回答
52 浏览

python - 试图更改副本但更改原件:(

我试图在我的井字游戏程序中制造一个“聪明”的对手。为此,我创建了一个“可能获胜”功能,它将决定下一回合是否有可能获胜。运行此代码时我的问题是,在 for 循环的每次迭代中,变量板似乎都发生了变化。

我想在每次迭代开始时将潜在板重置为原始板,这就是我在循环开始时包含 potential_board = board[:] 的原因。然后我编辑potential_board,但每次循环重复时,此变量都不会重置,实际上板也发生了变化。为什么是这样?

非常感谢!

编辑:通过使用 copy.deepcopy() 我设法解决了这个问题,但我不明白为什么这有效,而 copy.copy() 和 board[:] 不起作用?有人可以解释一下吗?

0 投票
1 回答
1646 浏览

c++ - 我在哪里可以找到 std::launder 的真正作用?

我试图了解是什么std::launder,我希望通过查找示例实现可以清楚地知道。

我在哪里可以找到一个示例实现std::launder

当我查看 lbic++ 时,我看到了类似的代码

这让我觉得这是另一个编译器魔术函数。

这个函数__builtin_launder可以做什么,它只是添加一个标签来抑制编译器关于别名的警告吗?

是否有可能理解std::launder__builtin_launder只是更多的编译器魔法(钩子)?

0 投票
2 回答
74 浏览

c++ - 使用负数组索引访问前一个成员

我想使用负数组索引来访问结构中紧接在该数组之前的相同类型成员。

考虑这种类型的代码:

我想用来b1[-1]访问b0.

当我尝试这样做时,clang 和 gcc 似乎完全理解我想要什么。

这在编译时正确地确定test42.

-1不幸的是,clang 会产生一个不受约束的警告。const如果我更改为.gcc 也会这样做constexpr

编写此类代码的正确方法是什么?

以下是我已经知道但不喜欢的方式:

  • a[]与基于 1 的索引一起使用。
  • 制作b1一个指向 的指针a[1]
0 投票
1 回答
69 浏览

java - 算法,第 4 版:不了解有关别名/引用的示例

课程代码链接:https ://introcs.cs.princeton.edu/java/33design/Counter.java

在此处输入图像描述

书上说会打印“2ones”,过程如上图所示。但我无法得到它。在我看来,c1 添加所以它的对象添加,所以我们得到“2”;然后将 c1 复制到 c2,c2 也得到“2”。随着 c2 添加,对象将转向未知的下一个网格。打印 c1 时,我认为我们应该得到“2”而不是“2ones”。那么我的流程有什么问题?提前致谢。