小编kas*_*kai的帖子

非模板类中模板方法中的DLL和静态变量

我花了几天时间搜索我的问题,但找不到任何可行的解决方案.

我有一个名为ServiceEventHub的类,它负责在我的应用程序中调度事件.代码的灵感来自我在网上发现的实现事件聚合器的内容.该应用程序是一个插件引擎,动态加载不同的DLL(插件).此类是引擎提供的服务,它位于应用程序(.exe)中.

问题是该类依赖于静态变量来跟踪发出和注册的不同"事件".(事件只是在公共头文件中定义的结构).从我的观点来看,由于在Windows上默认情况下不导出符号这一事实,静态变量与应用程序和dll中的实例不同.可以想象,引擎和插件之间的"事件类型"并不相同,并且它的行为不符合预期.这是我第一次在Windows上开发,我有点迷失了.

因为有些方法使用模板,所以我无法将实现移动到cpp文件.我已经尝试了dllexport/dllimport方法,但它再次无效,因为该类使用模板.另外,在我的情况下,它是导出的应用程序和导入的DLL,不确定它是否应该以这种方式工作.

我也看了#pragma data_seg,但我不知道如何使用它..对于全班?只使用静态的2种方法?

这是完整的代码:

class ServiceEventHub
{
public:

template <class EventType>
using Slot = std::function<void(const EventType&)>;

ServiceEventHub()
{

}

template <typename EventType>
void subscribe(Slot<EventType> callable)
{
    LOG_FUNC_ENTER();

    std::lock_guard<std::recursive_mutex> lock(m_mutex);
    size_t type = Event<EventType>::type();

    if (type >= m_subscribers.size())
    {
        m_subscribers.resize(type + 1);
    }

    m_subscribers[type].push_back(CallbackWrapper<EventType>(callable));
}

template <typename EventType>
void emit(EventType&& event)
{
    LOG_FUNC_ENTER(typeid(EventType).name());

    // Critical section starts
    std::lock_guard<std::recursive_mutex> lock(m_mutex);
    size_t type = Event<EventType>::type();

    if (type >= m_subscribers.size())
    {
        return;
    }

    Event<EventType> eventWrapper(std::forward<EventType>(event));
    for (auto& receiver : …
Run Code Online (Sandbox Code Playgroud)

c++ dll static templates dynamic

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

没有任何交换分区的虚拟内存

关于这个主题的其他主题很少,但我找不到明确的答案。

在 Linux 上,如果没有交换分区来执行 Paging,甚至没有辅助 I/O 设备(HDD、SSD 等),虚拟内存如何工作?

如果我举个例子:我在没有任何交换分区或辅助存储的嵌入式目标上运行自定义分发(来自 initramfs)。在 中top,我可以清楚地看到正在运行的进程消耗的虚拟地址 (VIRT) 比物理地址 (RSS) 多得多,例如 500MB 与 20MB。

VIRT 和 RSS 之间的区别是否只是分配但从未访问过的内存(因此从未被操作系统映射)?(内存过载)

我认为虚拟内存需要分页(不是谈论交换)才能工作,但我开始相信我错了(网上有很多关于 Linux 内存管理的废话)。

这是否意味着Page Fault这种配置中的 a会系统地调用 oom-killer?

干杯

linux memory paging virtual-memory

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

标签 统计

c++ ×1

dll ×1

dynamic ×1

linux ×1

memory ×1

paging ×1

static ×1

templates ×1

virtual-memory ×1