- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我观察到带有 GCC 标志 -flto
的意外行为(至少我找不到解释)和 jemalloc
/tcmalloc
.一次-flto
被使用并且我链接到上面的库 malloc/calloc 并且 friend 没有被 je/tc malloc
替换实现,调用glibc实现。一旦我删除 -flto
标志,一切都按预期工作。我尝试使用 -fno-builtin
/-fno-builtin-*
与 -flto
但是,它仍然没有选择 je/tc malloc
执行。-flto
机械工程?为什么二进制不选择新的实现?它甚至如何与 -fno-builtin
链接当它应该在 Unresolved external 失败时,例如 printf
?
编辑001:
海合会 7.3
示例代码
int main()
{
auto p = malloc(1024);
free(p);
return 0;
}
/usr/bin/c++ -O2 -g -DNDEBUG -flto -std=gnu++14 -o CMakeFiles/flto.dir/main.cpp.o -c /home/user/Development/CPPJunk/flto/main.cpp
/usr/bin/c++ -O2 -g -DNDEBUG -flto CMakeFiles/flto.dir/main.cpp.o -o flto -L/home/user/Development/jemalloc -Wl,-rpath,/home/user/Development/jemalloc -ljemalloc
#include <cstdlib>
int main()
{
auto p = malloc(1024);
if (p) {
free(p);
}
auto p1 = new int;
if (p1) {
delete p1;
}
auto p2 = new int[32];
if (p2) {
delete[] p2;
}
return 0;
}
最佳答案
首先,您的示例代码是错误的。仔细阅读 C11 标准 n1570 .当您想使用标准 malloc
, 你应该 #include <stdlib.h>
.
在 C++11 中(阅读 n3337)malloc
不赞成使用,不应使用(首选 new
)。如果你还想用 std::malloc
在 C++ 中你应该 #include <cstdlib>
(在 GCC 中,内部包含 <stdlib.h>
)
那么您的示例代码几乎是 C 代码(一旦将 auto
替换为 void*
),而不是 C++。可能是 optimized (一旦你包括 <stdlib.h>
),即使没有 -flto
但只有 -O3
,根据 as-if规则,为空 main
. (我什至写了一份公开报告,bismon-chariot-doc.pdf,其中有一节 §1.4.2 在几页中解释了优化是如何发生的)。
围绕 malloc
进行优化和 free
, GCC 使用了一些 __attribute__(malloc)
function attribute在 <stdlib.h>
的声明中(在 malloc
内) .
How the -flto machinery works?
-O2
甚至
-O3
)一起使用。所以你应该编译和链接
g++ -flto -O2
(使用
-flto
没有至少
-O2
没有实际意义,并且应该在编译和链接时使用完全相同的优化标志)。
-flto
还在目标文件中嵌入源代码的一些内部(
GIMPLE 类)表示,这也用于“链接时”(特别是
optimization 和
inlining 在“链接”整个程序时再次发生,重新使用它的 GIMPLE)。实际上 GCC 包含一些 LTO 前端和编译器,称为
lto1
(除了名为
cc1plus
的 C++ 前端和编译器)和
lto1
是(当您与
g++ -flto -O2
链接时)在链接时用于重新处理这些 GIMPLE 表示。
libjemalloc
有自己的标题,并且可能有
inline
(或内联)函数。那你还需要使用
-flto -O2
从源代码编译该库时(以便将其 Gimple 存储在库中)
malloc
被调用独立于
-flto
.这是一个链接器问题,而不是编译器问题。您可以尝试链接
-ljemalloc
静态地(然后你最好用
gcc -flto -O2
构建该库;如果你不这样构建它,你将不会在
malloc
调用中获得 LTO 优化)。
-v
到您的编译和链接命令以了解
g++
是在做。你甚至可以通过
-Wl,--verbose
问
ld
(由
g++
开始)是冗长的。
libjemalloc-dev
打包并添加
#include <jemalloc/jemalloc.h>
在你的代码中。另见
jemalloc(3)手册页。大概
libjemalloc
可以配置或修补以定义一些
je_malloc
malloc
的替代符号.那么使用
je_malloc
会更简单(对于 LTO)在您的代码中(以避免几个
malloc
ELF 符号之间的冲突)。要了解有关共享库中符号的更多信息,请阅读 Drepper 的
How to Write Shared Libraries纸。当然,您应该期望 LTO 改变链接行为!
关于c++ - glibc 函数的 GCC、-flto、-fno-builtin 和自定义函数实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53904726/
我最近的一个程序高度依赖于内联一些“热门”函数来提高性能。这些热门函数是我不想更改的外部 .c 文件的一部分。 不幸的是,虽然 Visual 非常擅长此练习,但 gcc 和 clang 却不是。显然,
我使用的是 GCC 4.7.2 和 LD 2.23,但是当我将 -flto 添加到我的编译选项时,我的编译时间增加了 20% 以上!该手册似乎表明优化工作需要 -fuse-linker-plugin。
如果我想用 -flto 编译我的项目用 --enable-gold 构建 gcc 就够了吗?或者我还需要建立黄金并用它替换 ld 吗?我还需要其他标志吗?即我正在做这个 gcc -flto one.c
我有一大段代码,仅在某些版本的 gcc 上使用 -flto 编译时会产生错误。我将尝试总结如下 在文件 1.h 中 extern char A [100]; 在文件 1.c 中 #include "f
我试图将大量代码塞进一个相当小的 ARM 微 Controller 中。我已经在大小优化方面做了大量工作,而且我已经到了需要双重算术的地步,但是 __aeabi_ddiv , __aeabi_dadd
我的问题很简单,关键字 inline 对链接时间优化的看法有影响吗?对于链接时间优化,我指的是支持 -flto(链接时间优化)的 GCC 版本。 例如: main.c #include "b.h"
我在以下代码文件中遇到 getline 崩溃。我构建了 gcc7.2,因为系统更新不可用。 最小的例子: #include int main(int argc, char *argv[]) {
我正在尝试在 g++ 中启用链接时间优化。我的程序在没有 -flto 选项的情况下编译得很好。当我将它添加到我的 Makefile 时,目标文件编译时不会出现错误,例如 g++ main.cpp -I
我正在尝试使用 llvm-lld 链接已使用 -flto 编译的对象。 我在路径调用 lld 中有 ld 以及提供的所有参数。我创建了一个简单的 C++ 程序,我用 clang++ 编译它: #inc
我正在使用具有 AVR Atmega2560 芯片的 Arduino Mega 2560。我正在使用 Windows 上的 Arduino IDE 1.8.4 对其进行编程,它附带 avr-objdu
我知道较新的 GCC 版本引入了可能错误的字符串操作“stringop-truncation”的警告 这是我可以轻松触发此警告的示例代码: $ cat strncpy-warning.cxx #inc
我正在使用 SystemWorkbench 4 stm32 对 STM32F413 微 Controller 进行编程。中断 vector 在程序集启动文件中定义为弱别名,如下所示: .weak
我观察到带有 GCC 标志 -flto 的意外行为(至少我找不到解释)和 jemalloc/tcmalloc .一次-flto被使用并且我链接到上面的库 malloc/calloc 并且 friend
我正在使用 flto 构建应用程序,我想在 make 中使用的所有内核上并行化它,例如,如果我使用 make -j4 然后在 4 个内核上运行它 例子: cmake_minimum_required(
我是一名优秀的程序员,十分优秀!