问题标签 [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 回答
387 浏览

c - c99之前的限制性

考虑到这段代码,VC9 没有检测到别名:

明显的解决方法是使用临时的:

这是标准行为吗?我期待编译器,除非被告知,否则会假设两个指针都可能有别名。

0 投票
4 回答
14539 浏览

c - 如何投射 so​​ckaddr_storage 并避免违反严格的别名规则

我正在使用 Beej's Guide to Networking 并遇到了别名问题。他提出了一个函数来返回特定结构的 IPv4 或 IPv6 地址:

这会导致 GCC 在第 3 行为sa吐出严格别名错误。据我了解,这是因为我这样调用此函数:

我猜测别名与their_addr变量的类型sockaddr_storage和另一个不同类型的指针指向同一内存的事实有关。

绕过这种坚持 , 和进入工会的最好方法sockaddr_storagesockaddr_in什么sockaddr_in6?看起来这应该是网络中的老旧领域,我只是找不到任何具有最佳实践的好例子。

另外,如果有人能准确解释混叠问题发生的位置,我将不胜感激。

0 投票
2 回答
215 浏览

performance - 奇怪的性能问题

我有一个类似于这个的容器。

我想放弃 Elt 拥有默认构造函数的要求:

我使用 g++-4.3,这段代码在我的应用程序中的运行速度比前一个慢 25% 。不幸的是,放缓并未体现在综合基准中。我想这与编译器优化、别名、对齐或类似的东西有关。

我应该怎么做才能恢复我的表现?(虽然不需要默认构造函数)

更新:

刚才我尝试了新的 g++-4.4,它给了我后一个代码的以下警告:

0 投票
1 回答
1321 浏览

pointers - 指针别名

“Strict”“Typed”“Restricted”“Disjointed”别名有什么区别?

0 投票
4 回答
1124 浏览

c++ - Placement-new vs gcc 4.4.3 严格别名规则

我有一些多年来一直成功使用的代码来实现“变体类型对象”;也就是说,一个 C++ 对象可以保存各种类型的值,但只使用(大约)与最大可能类型一样多的内存。该代码在精神上类似于标记联合,除了它也支持非 POD 数据类型。它通过使用 char 缓冲区、放置 new/delete 和 reinterpret_cast<> 来完成这个魔术。

我最近尝试在 gcc 4.4.3 下编译这段代码(使用 -O3 和 -Wall),并收到很多这样的警告:

根据我的阅读,这表明 gcc 的新优化器可能会生成“错误”代码,我显然希望避免这种情况。

我在下面粘贴了我的代码的“玩具版”;我可以对我的代码做些什么来使其在 gcc 4.4.3 下更安全,同时仍然支持非 POD 数据类型?我知道作为最后的手段,我总是可以使用 -fno-strict-aliasing 编译代码,但如果代码在优化下不会中断会很好,所以我宁愿不这样做。

(请注意,我想避免在代码库中引入 boost 或 C++0X 依赖项,因此虽然 boost/C++0X 解决方案很有趣,但我更喜欢更老式的东西)

0 投票
2 回答
936 浏览

c++ - 如何管理指向已引用对象内部数据的 shared_ptr?

假设我有这些课程:

出于性能方面的考虑,我想让它们紧密地封装在内存中(但我不想失去设计的灵活性)。因此,我可以创建一个“打包”结构,以及一个透明地返回新 B 实例的工厂:

问题是这个“汽车”实例永远不会被销毁,因为它的引用计数为 2。当它死亡时,它的引用计数将永远为 1。您是否知道继续使用内部 shared_ptr 的更好方法(以便我可以根据需要将“未打包”引用归因于),并且仍然制作此打包结构?

更新

我可以使用无操作删除器,但是如果我决定保留engine但不保留 ,那将是非常危险的car

0 投票
3 回答
257 浏览

c++ - 别名规则是否对称?

我在 IRC 上与某人进行了讨论,然后出现了这个问题。标准允许我们int通过char左值更改类型的对象。

如果我们知道对齐没问题,我们是否可以在相反的方向这样做?

我看到的问题是,如果将别名规则视为非对称关系,则别名规则不涵盖以下简单情况

原因是,每个对象都包含一系列sizeof(obj) unsigned char对象(称为“对象表示”)。如果我们更改int,我们将更改部分或全部这些对象。然而,别名规则只规定我们可以intcharor改变 a unsigned char,但不能反过来。另一个例子

3.10/15 只描述了一个方向(“包含...的聚合或联合类型”),但这次我们需要另一种方式(“作为元素或非静态数据成员类型的类型总计的...”)。

是否暗示了另一个方向?这个问题也适用于 C。

0 投票
1 回答
1230 浏览

c++ - 是否有类似 C++ 的限制关键字来指示 _iterators_ 没有别名

g++ 确实实现__restrict__了指针,但我找不到任何关于迭代器的信息。我的总体意图是鼓励编译器矢量化 stl 循环。

编辑:

即使编译器无法向量化,__restrict__关键字也应该能够告诉编译器循环内不需要不必要的重新加载。

0 投票
3 回答
125 浏览

python - 混叠混叠

我有以下代码按预期工作:

如果我稍微改变一下它仍然可以工作:

现在的问题:

有人可以向我解释为什么这会返回 False,而b is a[2] * 2返回 True 吗?

0 投票
2 回答
1672 浏览

collections - Java 集合和别名

你如何处理Java中的别名?一个简单的解决方案是制作一个 ArrayList 的副本,但是当我尝试编写代码时,我的数据不断被新添加的数据覆盖。详细地:

输出:

代替: