C++标准是怎么说动态库的?我听说它完全忽略了动态库(出于某种原因)--如果这是真的,为什么?
cygmwpex1#
实际上,动态库只有两个主要的陷阱,在那里你 * 可以 * 轻易地打破C++标准中的假设,使它不匹配abstract machine:
在这种情况下,默认情况下,例如,在Linux系统上使用ld-linux + gcc + ld,对 all 符号具有公共可见性,这意味着 all 符号在运行时由动态加载器解析,这实际上符合抽象机器的描述。不幸的是,出于性能原因,这种默认设置并不可取。限制符号的可见性是允许最基本形式的内联优化的先决条件。
ld-linux + gcc + ld
在这两种情况下,作为开发人员,您仍然有责任确保您处于抽象机器的范围内,并且不会导致任何与之相矛盾的可观察行为。理论就这么多了。事实上,在这两种情况下,大多数动态库实际上甚至不 * 尝试 * 作为一个整体,好像系统/进程符合C抽象机。相反,C只被期望在每个动态库中完全发挥作用,而整个外部接口完全意识到动态链接,符号可见性等,并避免任何可能暴露边界上未定义行为的C++功能。每个库- * 独立 * -遵循抽象机器。
1条答案
按热度按时间cygmwpex1#
实际上,动态库只有两个主要的陷阱,在那里你 * 可以 * 轻易地打破C++标准中的假设,使它不匹配abstract machine:
在这种情况下,默认情况下,例如,在Linux系统上使用
ld-linux + gcc + ld
,对 all 符号具有公共可见性,这意味着 all 符号在运行时由动态加载器解析,这实际上符合抽象机器的描述。不幸的是,出于性能原因,这种默认设置并不可取。限制符号的可见性是允许最基本形式的内联优化的先决条件。
在这两种情况下,作为开发人员,您仍然有责任确保您处于抽象机器的范围内,并且不会导致任何与之相矛盾的可观察行为。
理论就这么多了。
事实上,在这两种情况下,大多数动态库实际上甚至不 * 尝试 * 作为一个整体,好像系统/进程符合C抽象机。
相反,C只被期望在每个动态库中完全发挥作用,而整个外部接口完全意识到动态链接,符号可见性等,并避免任何可能暴露边界上未定义行为的C++功能。每个库- * 独立 * -遵循抽象机器。