小编Fir*_*cer的帖子

C++:从dll动态加载类

对于我当前的项目,我希望能够从一个DLL加载一些类(这并不总是相同的,甚至在我的应用程序编译时也不存在).对于给定的类,可能还有几个替代的dll(例如,Direct3D9的实现和OpenGL的一个实现),但是任何时候都只会加载/使用其中一个dll.

我有一组定义接口的基类以及我想要加载的类的一些基本方法/成员(即用于引用计数的那些),然后dll项目在创建类时派生出来.

//in namespace base
class Sprite : public RefCounted//void AddRef(), void Release() and unsigned refCnt
{
public:
    virtual base::Texture *GetTexture()=0;
    virtual unsigned GetWidth()=0;
    virtual unsigned GetHeight()=0;
    virtual float GetCentreX()=0;
    virtual float GetCentreY()=0;
    virtual void SetCentre(float x, float y)=0;

    virtual void Draw(float x, float y)=0;
    virtual void Draw(float x, float y, float angle)=0;
    virtual void Draw(float x, float y, float scaleX, flota scaleY)=0;
    virtual void Draw(float x, float y, float scaleX, flota scaleY, float angle)=0;
};
Run Code Online (Sandbox Code Playgroud)

事情是我不知道如何做到这一切,以便可执行文件和其他dll可以加载和使用这些类,因为我只使用过只有一个dll的dll我可以让Visual Studio链接器将它全部排除使用我在编译dll时得到的.lib文件.

我不介意使用工厂方法实现类的实例化,其中许多已经设计好了(即一个sprite类是由主要的Graphics类创建的,例如Graphics-> CreateSpriteFromTexture(base …

c++ windows dll class

23
推荐指数
2
解决办法
2万
查看次数

跨平台等同于Windows事件

我正在尝试将一些Windows代码移植到Linux,理想情况是通过独立于平台的库(例如boost),但是我不知道如何移植这些事件代码.

代码位涉及两个线程(让我们称之为A和B).A想要做只有B可以做的事情,所以它向B发送消息,然后等待B说出它完成了.在Windows中,这看起来像:

void foo();//thread a calls this
void bar(HANDLE evt);

void foo()
{
    HANDLE evt = CreateEvent(0,FALSE,FALSE,0);
    bCall(boost::bind(&bar, evt));
    WaitForSingleObject(evt,INFINITE);
    CloseHandle(evt);
}
void bar(HANDLE evt)
{
    doSomething();
    SetEvent(evt);
}
Run Code Online (Sandbox Code Playgroud)

我查看了boost :: thread库,但它似乎没有任何东西可以做到这一点,我可以看到的关闭是boost :: condition_variable,但看起来这意味着与一个互斥量一起使用,但事实并非如此这里.

c++ windows multithreading boost cross-platform

23
推荐指数
3
解决办法
2万
查看次数

为什么C和C++没有内置方法来检查整数溢出?

为什么C和C++没有提供一组实现提供的操作来执行提供溢出检查的每个基本整数操作(例如a bool safeAdd(int *out, int a, int b)).

据我所知,大多数指令集都有办法判断操作是否溢出(例如x86溢出和进位标志),并且在有符号整数的情况下也会发生定义.

因此,编译器是否应该能够做得更好,创建更简单,更快速的操作,而不是用C和C++编写代码?

c c++ integer-overflow

21
推荐指数
4
解决办法
1564
查看次数

Visual Studio 2008 PRO中的分析

如何在Visual Studio 2008中使用分析器?

我知道配置属性 - >链接器 - >高级 - >配置文件(/ PROFILE)中的构建选项,但我找不到任何有关使用它的任何内容,只有我能够找到的文章似乎只适用于旧版本的Visual Studio(例如,大多数人说要转到Build-> Profile来调出配置文件对话框,但在2008年没有这样的菜单项).

这是因为Visual Studio 2008不包含探查器,如果它在哪里,它的文档在哪里?

c++ profiling visual-studio-2008 visual-studio

19
推荐指数
2
解决办法
2万
查看次数

python模块dlls

有没有一种方法,使一个Python模块加载DLL在我的应用程序目录,而不是与Python安装附带的版本,而无需对Python安装变化(当时这需要我做了一个安装程序,并小心我没"通过覆盖python模块和更改dll版本全球范围来打破其他应用程序的人...)?

具体来说,我想python的使用sqlite3.dll的我的版本,而不是与Python附带的版本(这是旧的并没有出现有FTS3模块).

python module

18
推荐指数
3
解决办法
2万
查看次数

将子进程自动附加到调试器

如果当前正在Visual Studio中调试主进程,我怎么能拥有它,以便它生成的任何新进程也附加到与主进程相同的Visual Studio实例?

目前,只需使用CreateProcess调用即可创建新流程,但是如果需要,我可以添加额外的代码或完全使用不同的API,以及对项目或解决方案配置进行更改(每个流程在单个解决方案中都有自己的项目) .

c++ debugging process visual-studio-2008

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

是否应该通过const引用传递小的简单结构?

我一直被告知非原始类型应该通过const引用传递,而不是通过值传递,即:

void foo(std::string str);//bad
void foo(const std::string &str);//good
Run Code Online (Sandbox Code Playgroud)

但我今天在想,也许实际上一些简单的用户定义类型实际上可能更好地通过值传递,例如:

class Vector2
{
public:
    float x, y;
    ...constructors, operators overloads, utility methods, etc...
};

void foo(Vector2 pos);
void foo(const Vector2 &pos);//is this really better than by value?
void foo(float x, float y);//after all isn't by value effectively doing this?
Run Code Online (Sandbox Code Playgroud)

我的想法是,通过引用传递Vector2,它实际上比传递值更昂贵,因为编译器现在使用指针和解除引用访问const Vector2&pos版本?

是这样的吗?最简单的对象是否最符合价值?该线应该在哪里绘制?

c++ function pass-by-reference user-defined-types

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

Python模块依赖

好的我有两个模块,每个模块都包含一个类,问题是它们的类互相引用.

让我们说例如我有一个房间模块和一个包含CRoom和CPerson的人员模块.

CRoom类包含有关房间的信息,以及房间中每个人的CPerson列表.

然而,CPerson类有时需要将CRoom类用于它的房间,例如找到门,或者看看房间里还有谁.

问题是两个模块互相导入我只是得到一个导入错误,其中第二次导入:(

在c ++中,我可以通过仅包含头来解决这个问题,因为在这两种情况下类都只有指向另一个类的指针,前向声明就足以满足标题,例如:

class CPerson;//forward declare
class CRoom
{
    std::set<CPerson*> People;
    ...
Run Code Online (Sandbox Code Playgroud)

反正有没有在python中执行此操作,除了将两个类放在同一个模块或类似的东西?

编辑:添加了使用上面的类显示问题的python示例

错误:

回溯(最近一次调用最后一次):
文件"C:\ Projects\python\test\main.py",第1行,
从房间导入CRoom
文件"C:\ Projects\python\test\room.py",第1行,
来自人员导入CPerson
文件"C:\ Projects\python\test\person.py",第1行,
从房间导入 CRoom
ImportError:无法导入名称
CRoom room.py

from person import CPerson

class CRoom:
    def __init__(Self):
        Self.People = {}
        Self.NextId = 0

    def AddPerson(Self, FirstName, SecondName, Gender):
        Id = Self.NextId
        Self.NextId += 1#

        Person = CPerson(FirstName,SecondName,Gender,Id)
        Self.People[Id] = Person
        return Person

    def FindDoorAndLeave(Self, PersonId):
        del Self.People[PeopleId]
Run Code Online (Sandbox Code Playgroud)

person.py

from room import CRoom

class CPerson:
    def __init__(Self, …
Run Code Online (Sandbox Code Playgroud)

python module circular-dependency

17
推荐指数
2
解决办法
1万
查看次数

Visual Studio 2008,C++的Profiler?

是否有任何好的,免费的(或至少相当便宜的)至少可以与Visual Studio 2008 Professional集成的本机C++的分析器?

我查看了DevPartner社区版,但它们似乎只支持Visual Studio 2003和Visual Studio 2005.

如果没有那么好的免费/便宜的剖析器,我可以与VS一起工作,相对较小的摩擦力?

c++ profiler visual-studio-2008

16
推荐指数
2
解决办法
2万
查看次数

利用SSE和其他CPU扩展

在我的代码库中有几个地方,对于大型数据集,相同的操作重复了很多次.在某些情况下,处理这些需要相当长的时间.

我相信使用SSE来实现这些循环应该会显着提高它们的性能,特别是在对同一组数据执行许多操作的情况下,所以一旦数据最初被读入缓存,就不应该有任何缓存未命中它.但是,我不确定是否会这样做.

  • 是否有编译器和OS独立的方式编写代码以利用SSE指令?我喜欢VC++内在函数,其中包括SSE操作,但我还没有找到任何交叉编译器解决方案.

  • 我仍然需要支持一些没有或有限SSE支持的CPU(例如Intel Celeron).有没有办法避免不得不制作不同版本的程序,比如有一种"运行时链接器"链接在基本或SSE优化代码基于运行进程时运行它的CPU?

  • 那么其他CPU扩展怎么样,看看各种Intel和AMD CPU的指令集,其中有几个?

c++ gcc cross-platform simd visual-c++

15
推荐指数
2
解决办法
5360
查看次数