小编Sla*_*ava的帖子

mingw -fvisibility = hidden似乎不起作用

我有一个共享库,它应该只导出一个标有的函数__attribute__ ((visibility ("default"))).它还链接到另一个静态库(fftw),和

#include<fftw3.h>
Run Code Online (Sandbox Code Playgroud)

之前是:

#pragma GCC visibility push(hidden)
Run Code Online (Sandbox Code Playgroud)

使用的链接器命令:

g++.exe -fvisibility=hidden -shared -o mylib.dll -Wl,--out-implib,mylib.dll.a -Wl,--no-whole-archive libfftw3.a libfftw3_omp.a -lgomp 
Run Code Online (Sandbox Code Playgroud)

现在生成的库很庞大,如果我检查导出的函数,它包括所有fftw函数,以及我文件中的ALL函数.看起来mingw忽略了可见性选项.我读过之前它给出了警告-fvisibility,但现在它编译时没有任何警告.

mingw和gcc 4.6.1是否支持可见性标志?如果是,我如何摆脱共享库中的所有不必要的东西?

visibility mingw shared-libraries

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

使用constexpr函数的结果作为模板参数(clang vs gcc)

请看下面的代码,抱歉有点冗长,但我尽力用最小的例子重现问题(还有它的实时副本).在那里我基本上有一个返回字符串文字大小的元函数,以及包装它的constexpr函数.然后当我在模板参数中调用这些函数时,gcc(5.4,6.2)对它很满意,但是在测试体中,clang(3.8,3.9)barfs与"非类型模板参数不是常量表达式" strsize(s).如果我用str_size<S>两个编译器替换都很高兴.所以问题是:

  1. 这是clang或我的代码有问题吗?

  2. 使用constexpr函数在clang和gcc上编译它的方法是什么?

    template<size_t N> using string_literal_t = char[N];
    
    template<class T> struct StrSize; ///< metafunction to get the size of string literal alikes 
    
    /// specialize StrSize for string literals
    template<size_t N>
    struct StrSize <string_literal_t<N>>{ static constexpr size_t value = N-1; };
    
    /// template variable, just for convenience
    template <class T>
    constexpr size_t str_size = StrSize<T>::value;
    
    /// now do the same but with constexpr function
    template<class T>
    constexpr auto strsize(const T&) noexcept-> decltype(str_size<T>) {
       return …
    Run Code Online (Sandbox Code Playgroud)

c++ templates clang constexpr

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

从类中返回指针.谁负责删除?

我有一个C++类,它实现了二进制兼容接口(用作共享库),因此只返回C类型.字符串为const char*,void指针,以及指向具有二进制兼容接口的其他类的指针.问题是如何组织内存管理,我应该返回现有类数据的常量指针(用户使用过时指针的危险),并在那里释放内存,或者更确切地指向某些堆变量,并让用户负责删除这些指针以后还是??? 对此有一些一般性的指导方针吗?

c c++ abi

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

double*bool乘法有多快,它可以被矢量化吗?

vector<bool>在不同的vector<double>次数上乘以常数.我想知道它有多快,首先将其转换为更快vector<double>,以便可以使用sse吗?

    void applyMask(std::vector<double>& frame, const std::vector<bool>& mask)
    {
        std::transform(frame.begin(), frame.end(), mask.begin(), frame.begin(), [](const double& x, const bool& m)->double{ return x*m;});
    }
Run Code Online (Sandbox Code Playgroud)

c++ vectorization

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