小编Man*_*oor的帖子

为什么共享库中强制导出 std:: 符号?

如果你的共享库内部使用C++,那么std::它引用的所有模板和类型都将导出为弱符号。即使您使用-fvisiblity=hidden-Wl,--exclude-libs,ALL. 隐藏这些符号的唯一方法是使用版本脚本。

这些强制出口的目的是什么?

用版本脚本隐藏它们有什么坏处吗?

c++ linux linker gcc shared-libraries

14
推荐指数
1
解决办法
786
查看次数

有关编译巨大代码生成的源文件的任何技巧?

我正在尝试编译来自大型Dymola模型的生成C代码。生成的代码与人类编写的代码不同,存在许多展开的循环,大量使用了宏,手动索引了巨大的数组,最重要的是源文件很大(> 1e6行)。

当使用O2或编译这些源文件时O3,我的编译时间变得非常高:每个文件10至30分钟。Clang和GCC都有。我不能很好地遵循生成的汇编代码,因此我不确定优化的质量。通过不生成调试信息或关闭警告可以减少编译时间,但是与关闭优化相比,这些警告很小。在运行时方面,O0和之间有明显的区别O2,所以我不能证明这样做是合理的。使用进行编译时-ftime-trace,我可以看到Clang前端负责90%以上的时间。据称,该过程不是内存瓶颈,它似乎完全受CPU限制htop

我可以做一些预处理来改善编译时间吗?将源文件分成较小的块会提高性能,为什么?编译器是否设计为可以处理这些巨大的源文件?还有其他我应该注意的编译选项吗?

令人惊讶的是,Windows上的MSVC /O2花费的时间只是Clang和GCC的一小部分。

编译器参数示例: clang -m64 -Wno-everything -c -D_GNU_SOURCE -DMATLAB_MEX_FILE -ftime-report -DFMI2_FUNCTION_PREFIX=F2_Simulations_SteadyState_SteadyState2019MPU_ -DRT -I/opt/matlab/r2017b/extern/include -I/opt/matlab/r2017b/simulink/include -I/mnt/vagrant_shared/<path>/Source -I/mnt/vagrant_shared/<path>/export -fexceptions -fPIC -fno-omit-frame-pointer -pthread -O0 -DNDEBUG -std=c99 /mnt/vagrant_shared/<path>/some_file.c -o /mnt/vagrant_shared/<path>/some_obj.obj

平台:在虚拟机VM上运行的CentOS 7。Clang 7,GCC 4.8(由于其他要求,我坚持使用这些旧版本)。

c gcc compilation clang dymola

6
推荐指数
1
解决办法
141
查看次数

为什么向量下标超出范围?

我正在尝试编写这个非常简单的加法程序以供练习。

它接受输入列表并将其存储在向量中。然后它从向量中取出每个连续的元素并求和。

#include <iostream>
#include <vector>

int main()
{
    std::vector<int> i;

    int input;
    int sum = 0;
    int y = 0;

    while (std::cin >> input && input != 0000) {
        i.push_back(input);

    }

    for (y; y < sizeof(i); y++) {

        sum = sum + i[y];
    }
    std::cout << sum;
}
Run Code Online (Sandbox Code Playgroud)

但是,当我编译并运行程序时,它可以正常工作,直到 for 循环开始运行,然后编译器停止并吐出向量下标超出范围的消息?

我做错了什么?

c++ for-loop vector addition accumulate

1
推荐指数
1
解决办法
96
查看次数

C++ 打印浮点数为 nan

这是一个简化的 C++ 程序,将 4 个字节转换为它们的 IEE754 浮点表示。

#include <iostream>
#include <math.h>
#include <memory.h>

uint8_t bytes[4] = {0x40, 0xd5, 0xc6, 0x7f}; // 0x40d5c67f
float f;

int main()
{
    memcpy(&f, &bytes[0], 4);
    printf("%.*lf", 5, f);
}
Run Code Online (Sandbox Code Playgroud)

它的输出是nanisnan也为它返回true。这是怎么发生的?0x40d5c67f 是 6.6804...

在我的类似 arduino 的微控制器和http://cpp.sh/ 上都会发生

c++ floating-point nan

0
推荐指数
1
解决办法
76
查看次数