- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
只是好奇,GCC 或 Clang 工具集是否实现了等效于 MSVC 的 identical COMDAT folding (ICF) 目前?如果没有,有什么计划吗?除了旧的 GCC 邮件列表消息之外,我似乎找不到任何有关该主题的最新权威链接。
如果不是,这是否意味着不同类型的模板实例化在生成的二进制文件中总是不同的函数(在它们没有完全内联的情况下),即使它们是二进制兼容的,或者是否有其他机制来处理这个在其他层面?
另外,有没有人发现 ICF 在实践中最小化生成的可执行文件的大小方面有很大的不同?我没有任何大型 MSVC 项目可以方便地对其进行测试。 (我猜只有当您碰巧在许多不同的 vtable-layout 兼容类型上实例化模板时,它才会真正有帮助。)
最后,对于指向不同函数的两个函数指针在运行时比较相等是否符合 C++11 标准? This link似乎暗示它不是,但它适用于 C99。编辑:found previous question on this topic
最佳答案
GCC 和 Clang 都不是链接器,ICF 需要由链接器完成,或者至少与链接器合作完成。编辑:他们不做 ICF,所以是的,不同的实例会产生不同的代码。 GNU gold
链接器通过 --icf
支持 ICF选项,需要 GCC 选项 -ffunction-sections
要使用的。
不同的函数必须具有不同的地址......我不记得是否为任何获取其地址的函数禁用了 ICF,但如果不是,则应该可以在组合函数之前放置大量无操作指令并使每个不同的实例化开始于不同的指令,因此它们具有不同的地址。编辑:金的--icf=safe
选项只为可以证明没有使用其地址的函数启用 ICF,因此依赖于不同地址的代码仍然可以工作。
ICF 是一种巧妙的优化,但不是必需的。通过一些努力,您可以将非依赖代码提升到非模板或具有较少参数的模板,以减少可执行文件中重复代码的数量。在 Diet Templates 的幻灯片中有更多关于此的信息。几年前我做过的谈话。
关于templates - GCC(/Clang) : Merging functions with identical instructions (COMDAT folding),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15168924/
(按标题道歉,我不能做得更好) 我的问题是找到一些通用的结构或“标准”函数来执行下一件事: xmap :: (a -> b) -> f a -> g b 然后,我们不仅可以映射元素,还可以映射整个结构
我正在尝试构建一个分为首屏和非首屏部分的页面,让查看者有一种进入海底的印象。我遇到了一个绊脚石,因为当涉及到 CSS 定位的概念时,我的脑子里有些东西就是拒绝点击。 最终,我试图在折叠下方添加另一个部
我正在尝试使用 Rayon启动一系列顶级线程以递归调用模拟函数。该代码在使用 channel 发送和接收时有效,因此它是多线程兼容的,但它无法使用 par_iter() 进行编译。 fn simula
所以我的任务是在 Scheme 中使用 fold-left 或 fold-right 实现最基本版本的 'map' 函数和 'filter' 函数。我很难理解这些函数到底在做什么。这是我所拥有的: (
我的序列、数组等的顺序很重要。我曾尝试在 List、Seq 和 Array 之间进行转换,以查看是否存在差异,并且在每种情况下都将顺序颠倒。 例如,我有一个 [名词] [动词] [形容词] 的序列,它
我发现自己一遍又一遍地重复一个模式,我想把它抽象出来。我相当有信心 coq 具有足够的表现力来捕捉模式,但我在弄清楚如何做到这一点时遇到了一些麻烦。我正在定义一种编程语言,它具有表示句法术语的相互递归
我有一个类型如下的函数: union :: a -> a -> a 和a有 加性 属性(property)。所以我们可以看成union作为 (+) 的一个版本 比如说,我们有 [a] ,并希望执行并行
我编写了以下代码,它创建了一个无限的斐波那契数列: fibs = 1:1:fib 1 1 where fib a b = a+b:fib b (a+b) 上面的代码可以用foldl写吗?或 fol
(rust noob here;我试图理解在高阶函数情况下什么可以/不能/应该/不应该通过引用传递) let a = [1, 2, 3]; 此调用有效: let sum = a.iter().fold
我对 Haskell 基础知识之一有疑问:Fold + 匿名函数 我正在使用 foldl 开发 bin2dec 程序。 解决方案如下所示: bin2dec :: String -> Int bin2d
让我们假设 fn scan(int, int) -> int。 使用时 fn count(x: int, y: int) -> int { scan(x - 1, y - 1) + scan(
我正在尝试实现一个通用的缺点列表,它比本书第 15 章中使用的列表更高级: use std::fmt::Debug; #[derive(Debug)] enum List { Nil,
我有一个网站,顶部有一个水平的 ul/li 按钮。如果有人缩小窗口,按钮会向下折叠成两排。有点丑。 举个例子: http://www.redolog.com 我想知道是否有一个布局指令说“看,你必须至
我正在使用下面的代码,改编自 this线。我能够获取文件夹中的文件列表,但最后出现段错误。知道为什么会这样吗? 有没有办法在for循环中获取当前文件(完整路径)的std::string? boost
问题如何以编程方式确定“折叠”(浏览器显示多少垂直内容)? “折叠”定义为您再也看不到/必须滚动的地方。 我曾尝试使用 JavaScript 来简单地确定浏览器窗口大小来确定折叠;不幸的是 - 这不能
人们普遍认为 1024x768 浏览器是目标,960 - 980 像素的宽度是可以接受的。 (我个人更喜欢 960 的 chrome,但没有争论的意义。) 我的问题是 - 通常可以假设用户的窗口高度是
我正忙于学习 F# 并在玩弄 Seq.fold。任何人都可以解释为什么以下两个调用本质上不相同,一个错误而另一个错误。 这样调用: Seq.fold (fun state input -> state
我相信这是有充分理由的,但我没有看到。 Fold在(说)List返回 the result of applying fold operator op between all the elements
我的家庭作业进行得非常顺利,直到我偶然发现了最后一项任务。 首先,我必须定义一个自定义 List结构体: data List a = Nil | Cons a (List a) deriving Sh
因此,有一种称为“折叠的通用属性”的东西,确切地说如下: g [] = i; g (x:xs) = f x (g xs) g = fold f i 但是,正如您现在可能的那样,有像 dropWhil
我是一名优秀的程序员,十分优秀!