- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我想确切地理解为什么内联函数的 libc++ 可见性宏使用 __forceinline
或 __attribute__((__always_inline__))
作为它关联的属性的一部分内联函数。
背景见:
如果这些内联函数无论如何都将被标记为 __visibility__("hidden")
,为什么还需要额外强制编译器将它们内联?
我想了一下,我有一些假设,但似乎没有一个让我完全满意:
hidden
属性还不够吗?同样,构建库时是否只需要强制内联函数?消费者不应该关心。visibility("hidden")
的预期(和可接受的)结果吗?我问这个是因为我正在构建一个 C++ 库,我希望有一天能为此标准化 ABI,并且我正在使用 libc++ 作为指南。到目前为止,它运行良好,但这个问题引起了一些挠头。
特别是,我们收到了用户提示 MSVC 拒绝遵守 __forceinline
属性的报告,这导致了警告。我们建议的解决方案是在构建库时,将我们的类似 INLINE_VISIBILITY 的扩展仅包含 __forceinline
(或 GCC 等效项),假设上面的第一个解释。
但是,由于我们并不完全有信心首先理解强制内联函数为 __forceinline
或 __attribute__((__always_inline__))
背后的原因,我们对采用这个解决方案有些犹豫。
谁能给出明确的答案,说明为什么 libc++ 觉得有必要强制内联其内联函数,即使它们已经被装饰为具有隐藏的可见性?
最佳答案
我可能是解决这个问题的最佳人选,因为我就是这样做的人。你可能不喜欢这个答案。 :-)
当我创建 libc++ 时,我唯一的目标是 macOS (OS X)。这是在 libc++ 开源之前的方式。我强制内联的主要动机是控制将随操作系统版本推出的 dylib 的 ABI。强制内联函数永远不会出现在 dylib 中,因此我可以指望它只存在于 header 中(它具有与操作系统版本不同的交付系统)。
我从来没有考虑过“隐藏”这个附加属性作为这个决定的一部分,因为它对我来说只是一个不必要的并发症。我希望该函数位于 header 中,永远不会放入 dylib 中,仅此而已。所以我认为你的第一个项目符号是正确的。
我很高兴 libc++ 已经超越了它原来的范围,我希望你能继续努力。我很乐意提供我可能需要帮助您实现目标的任何其他信息。
关于c++ - 为什么 libcxx 应用 __forceinline 或 GCC 等效于它已经隐藏的内联函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40389994/
背景 llvm、clang、libcxx/libcxxabi 是我从源代码构建的。它们位于 usr/local。 最小源文件 //findpath.cpp #include int main(){
Conan 安装失败并显示以下消息。正如我所了解的那样,这是一个大约从 2018 年开始的问题。 我确实关注了一些关于更改配置、默认值、配置文件的讨论,有希望在下午进行讨论等,但没有看到有效的解决方案
在 libcxx/include/type_traits , std::is_function以如此紧凑的方式实现: namespace __libcpp_is_function_imp { stru
Clang 以这种方式实现 std::nullopt_t: struct nullopt_t { explicit constexpr nullopt_t(int) noexcept {} }
我按照说明从头开始安装 clang here .之后,我根据说明 here 使用 libsupc++ 安装了 libc++ . 现在,每当我使用 clang 和 libc++ 编译和链接程序时,我都需
我正在使用新的 libcxx 库,并且我有一个调用套接字函数的代码 bind() .问题是当我输入 using namespace std;编译器给了我以下代码的错误: int res = bind(
我想知道在哪里std::thread::join在 libcxx 中实现。虽然它在 中声明header,好像没有定义。我什至查看了 libcxxabi,但也找不到它。 那么有人可以指出它是在哪里实现
我正在尝试使用来自源代码的 libc++ 构建 Clang。我试图在树外将 libc++ 与其他组件构建在一起。我使用的食谱如下。 如果我只是将 libcxx 和 libcxxabi 放在树中,那么配
当使用 -fsanitize=address 构建时,我有时会看到来自 libc++ 类的错误内存访问问题。 这些错误在每次运行中似乎都不会重复,有时甚至根本不会发生。 发生了什么事?我怎样才能避免这
这里是 __dependent_type 的定义: template struct _LIBCPP_TEMPLATE_VIS __dependent_type : public _Tp {}; 所有
我想确切地理解为什么内联函数的 libc++ 可见性宏使用 __forceinline 或 __attribute__((__always_inline__)) 作为它关联的属性的一部分内联函数。 背
我想在 CentOS 7 上使用带有 clang/clang++ 的 C++11 或 C++14。如何构建这个构建环境? 最佳答案 本文讲授如何在 CentOS 7 上构建 C++11 构建环境:RH
我是一名优秀的程序员,十分优秀!