问题标签 [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.
c - c99之前的限制性
考虑到这段代码,VC9 没有检测到别名:
明显的解决方法是使用临时的:
这是标准行为吗?我期待编译器,除非被告知,否则会假设两个指针都可能有别名。
c - 如何投射 sockaddr_storage 并避免违反严格的别名规则
我正在使用 Beej's Guide to Networking 并遇到了别名问题。他提出了一个函数来返回特定结构的 IPv4 或 IPv6 地址:
这会导致 GCC 在第 3 行为sa吐出严格别名错误。据我了解,这是因为我这样调用此函数:
我猜测别名与their_addr
变量的类型sockaddr_storage
和另一个不同类型的指针指向同一内存的事实有关。
绕过这种坚持 , 和进入工会的最好方法sockaddr_storage
是sockaddr_in
什么sockaddr_in6
?看起来这应该是网络中的老旧领域,我只是找不到任何具有最佳实践的好例子。
另外,如果有人能准确解释混叠问题发生的位置,我将不胜感激。
performance - 奇怪的性能问题
我有一个类似于这个的容器。
我想放弃 Elt 拥有默认构造函数的要求:
我使用 g++-4.3,这段代码在我的应用程序中的运行速度比前一个慢 25% 。不幸的是,放缓并未体现在综合基准中。我想这与编译器优化、别名、对齐或类似的东西有关。
我应该怎么做才能恢复我的表现?(虽然不需要默认构造函数)
更新:
刚才我尝试了新的 g++-4.4,它给了我后一个代码的以下警告:
pointers - 指针别名
“Strict”、“Typed”、“Restricted”和“Disjointed”别名有什么区别?
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 解决方案很有趣,但我更喜欢更老式的东西)
c++ - 如何管理指向已引用对象内部数据的 shared_ptr?
假设我有这些课程:
出于性能方面的考虑,我想让它们紧密地封装在内存中(但我不想失去设计的灵活性)。因此,我可以创建一个“打包”结构,以及一个透明地返回新 B 实例的工厂:
问题是这个“汽车”实例永远不会被销毁,因为它的引用计数为 2。当它死亡时,它的引用计数将永远为 1。您是否知道继续使用内部 shared_ptr 的更好方法(以便我可以根据需要将“未打包”引用归因于),并且仍然制作此打包结构?
更新
我可以使用无操作删除器,但是如果我决定保留engine
但不保留 ,那将是非常危险的car
:
c++ - 别名规则是否对称?
我在 IRC 上与某人进行了讨论,然后出现了这个问题。标准允许我们int
通过char
左值更改类型的对象。
如果我们知道对齐没问题,我们是否可以在相反的方向这样做?
我看到的问题是,如果将别名规则视为非对称关系,则别名规则不涵盖以下简单情况
原因是,每个对象都包含一系列sizeof(obj)
unsigned char
对象(称为“对象表示”)。如果我们更改int
,我们将更改部分或全部这些对象。然而,别名规则只规定我们可以int
用char
or改变 a unsigned char
,但不能反过来。另一个例子
3.10/15 只描述了一个方向(“包含...的聚合或联合类型”),但这次我们需要另一种方式(“作为元素或非静态数据成员类型的类型总计的...”)。
是否暗示了另一个方向?这个问题也适用于 C。
c++ - 是否有类似 C++ 的限制关键字来指示 _iterators_ 没有别名
g++ 确实实现__restrict__
了指针,但我找不到任何关于迭代器的信息。我的总体意图是鼓励编译器矢量化 stl 循环。
编辑:
即使编译器无法向量化,__restrict__
关键字也应该能够告诉编译器循环内不需要不必要的重新加载。
python - 混叠混叠
我有以下代码按预期工作:
如果我稍微改变一下它仍然可以工作:
现在的问题:
有人可以向我解释为什么这会返回 False,而b is a[2] * 2
返回 True 吗?
collections - Java 集合和别名
你如何处理Java中的别名?一个简单的解决方案是制作一个 ArrayList 的副本,但是当我尝试编写代码时,我的数据不断被新添加的数据覆盖。详细地:
输出:
代替: