小编Sig*_*erm的帖子

支持完全C++ 11的Windows C++编译器(应该与Qt一起使用)

哪个C++编译器目前在Windows平台上有完整的 C++ 11支持?

Microsoft编译器目前没有完整的C++ 11支持(并且不会很快添加它).
MinGW g ++(来自mingw.org)不支持std::thread开箱即用.它也无法编译Qt 4源(在构建QtGuid4.dll时耗尽内存,已知的解决方法对我不起作用).
我已经浪费了好几天试图让Windows上的clang工作,设法编译它,但无法启用c ++ 11支持,因为它需要libstdc ++(我认为)当时没有移植到Windows平台.Qt 4也不支持它.

那里还有什么?我已经为C++ 03工作了很长时间,我想给新功能一个旋转,但我真的不想要一个不完全支持的工具(这会增加额外的头痛,同时写一个代码)或链接库时可能耗尽内存(在8GB系统上).

我正在使用Windows 7 64位,虽然有64位支持会很好,但我最感兴趣的是32位应用程序,因此生成64位可执行文件的能力是可选的.

有什么建议?

c++ windows qt c++11

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

我为什么要学习哈斯克尔?

可能重复:
Haskell与现实世界中的程序编程

很少有人听到人们说"每个程序员都应该知道Haskell","如果你不了解haskell就不是程序员"等等.但是,我不确定我是否应该费心去尝试简短地理解这种语言.使用口译员(直观地了解基础知识)至少需要几天(如果不是几周),而且我不确定结果是否值得.

一点背景(了解我的知识)
我从小就开始编程(大概在10年或13年前),可编程计算器,移动到基本,然后到非x86汇编(重新复用乘法和除法,编写自修改鼠标驱动程序很有趣),pascal, delphi,现在我几乎完全使用C++.了解unix shell的方法,可以在python中编写软件,也可以在任何东西(如果我附近有参考书)中编写远程类似于C++或Pascal的软件(即块,类似的流控制等).专业化是3D编程和着色器."在水中钓鱼"具有低级操作(C风格的内存分配,指针),对于极度OOP方法不太熟悉(即,为了创建类而创建类).几乎完全是自学成才.我绝对不是新手,但有些地方我可以改进.

那么......在这一点上我可以从学习Haskell获得什么呢?据我所知,这种语言并没有被广泛使用,因此它可以与更少的库接口(就像Delphi编程一样 - 你可以在delphi中进行DirectX编程,如果你真的想要,但你可以用它来写3dsmax/maya插件(好吧,理论上可能是这样,但它肯定不容易)).我也不认为我能够轻松地将一段Haskell代码插入到游戏引擎中.

那么,我可以从中获得什么样的有用知识呢?

PS我不会买"如果你学习另一种语言,你可能会学到一些可能有用的东西"的论点.

haskell

36
推荐指数
5
解决办法
3万
查看次数

常见的lisp:可移植性

如果我在Windows上使用clozure cl制作普通lisp(使用:lispbuilder-sdl,quicklisp,cffi)的2D游戏,我能否轻松将其移植到其他平台(linux/iPhone(也许)/ android)以后?lisp"适合"可安装的程序吗?

信息

  1. 游戏将使用OpenGL进行图形处理.很可能它会使用sdl进行输入/ opengl初始化,并使用sdl或openal进行音频处理.最终可能会使用我自己的库而不是sdl.
  2. 为cffi编写几个C++库(以"可移植"方式包装功能)不是问题.

推理

我真的,真的厌倦了C++.想要尝试更简单的语法+更强大的功能(不是python).记住一个游戏项目,想知道如果我突然决定稍后分发/移植游戏,是否为游戏选择lisp意味着严重的麻烦.

- 编辑 -

附加信息

"适当的"和"可安装的程序"是什么意思?

如果我尝试将可以在我的机器上运行的已完成程序转换为可安装程序包(例如,Windows上的Windows安装程序),我不确定CFFI/quicklisp将如何运行.例如,quicklisp在用户的主目录中设置路径/存储库(这可能是不可接受的行为)并尝试从外部源自动下载包,这在您尝试分发程序并确保其工作时不是一件好事意.CFFI在某些方面"绑定"外部库到lisp函数,并且我不清楚它是如何工作的,比如,如果我转储程序映像,将其嵌入到exe并在另一台机器上运行所述exe.根据常识,它应该可以正常工作,但在最坏的情况下,它可能导致我必须编写特定于lisp分发的复杂安装程序.

opengl portability common-lisp

20
推荐指数
2
解决办法
2754
查看次数

嵌套类:从嵌套的受保护类访问受保护的类的成员

此代码在msvc/g ++上编译:

class A{
protected:
    int i;
    class B{
    public:
        A* a;
        B(A* a_)
        :a(a_){
        }
        void doSomething(){
            if (a)
                a->i = 0;//<---- this part
        }       
    };
public:
    A()
    :i(0){
    }
};
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,B可以访问封闭类的"受保护"部分,尽管它未被声明为朋友.

这是标准(符合标准)的行为吗?

我有时使用此功能,但我不记得规则说嵌套的受保护类应该自动访问封闭类的所有受保护数据.

c++

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

c ++浮点精度损失:3015/0.00025298219406977296

问题.

Microsoft Visual C++ 2005编译器,32位windows xp sp3,amd 64 x2 cpu.

码:

double a = 3015.0; 
double b = 0.00025298219406977296;
//*((unsigned __int64*)(&a)) == 0x40a78e0000000000  
//*((unsigned __int64*)(&b)) == 0x3f30945640000000  
double f = a/b;//3015/0.00025298219406977296;
Run Code Online (Sandbox Code Playgroud)

计算结果(即"f")是11917835.000000000(((unsigned __int64)(&f))== 0x4166bb4160000000)虽然它应该是11917834.814763514(即((unsigned __int64)(&f))== 0x4166bb415a128aef).
即分数部分丢失.
不幸的是,我需要小数部分才能正确.

问题:
1)为什么会发生这种情况?
2)我该如何解决这个问题?

附加信息:
0)结果直接来自"监视"窗口(它没有打印,我没有忘记设置打印精度).我还提供了浮点变量的十六进制转储,所以我对计算结果非常肯定.
1)f = a/b的反汇编是:

fld         qword ptr [a]  
fdiv        qword ptr [b]  
fstp        qword ptr [f]  
Run Code Online (Sandbox Code Playgroud)

2)f = 3015/0.00025298219406977296; 得到正确的结果(f == 11917834.814763514,((unsigned __int64)(&f))== 0x4166bb415a128aef),但看起来在这种情况下,结果只是在编译时计算:

fld         qword ptr [__real@4166bb415a128aef (828EA0h)]  
fstp …
Run Code Online (Sandbox Code Playgroud)

c++ double x86 floating-accuracy

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

使用CMake添加不在子目录中的依赖项

假设有以下目录结构:

root
  |
  +--projects
  |      |
  |      +-test
  |         |
  |         +-CMakeFiles.txt
  |
  +--libs
       |
       +-testlib
            |
            +-CMakeFiles.txt
Run Code Online (Sandbox Code Playgroud)

test包含CMakeFiles.txttestlib包含CMakeFiles.txt."test"生成可执行文件,"testlib"生成静态库.

我希望"test"与"testlib"链接,而不使用符号链接,也不需要将"testlib"库移动到"test"中的子目录中.

因为"testlib"不是"test"的子目录,所以我不能这样做

add_subdirectory("../../libs/testlib")
Run Code Online (Sandbox Code Playgroud)

在测试中CMakeFiles.txt- CMake会抱怨"testlib"不在"test"子目录中.

另外,因为系统有几个不同的编译器,我不能简单地将"testlib"库安装到某种中心目录中,所以我想test编译一个本地副本testlib并与之链接(即好像testlib是一个子目录).我还希望"test"项目能够自动重建"testlib"(如果已经更改).

那么,我该如何处理呢?我在Windows XP SP3上使用CMake 2.8.4.

cmake

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

从dll返回std :: string/std :: list

简短的问题.

我只是得到了一个我应该与之接口的DLL.Dll使用来自msvcr90D.dll的crt(注意D),并返回std :: strings,std :: lists和boost :: shared_ptr.操作员new/delete不会在任何地方超载.

我假设crt mixup(发布版本中的msvcr90.dll,或者如果其中一个组件使用较新的crt重建等)最终会导致问题,并且应该重写dll以避免返回任何可能调用new/delete的内容(即任何可以在我的代码中调用删除在dll中分配的内存块(可能使用不同的crt)的任何内容).

我是对还是不对?

c++ dll winapi

12
推荐指数
2
解决办法
6479
查看次数

空间有限的优先级队列:寻找一个好的算法

这不是作业.

我正在使用一个小的"优先级队列"(目前实现为数组)来存储具有最小值的最后N个项目.这有点慢 - O(N)项目插入时间.当前实现跟踪数组中的最大项并丢弃任何不适合数组的项,但我仍希望进一步减少操作数.

寻找符合以下要求的优先级队列算法:

  1. queue可以实现为数组,它具有固定的大小和_cannot_ grow.严禁在任何队列操作期间进行动态内存分配.
  2. 任何不适合数组的东西都会被丢弃,但是队列会保留所有遇到的最小元素.
  3. O(log(N))插入时间(即将元素添加到队列中应占用O(log(N))).
  4. (可选)O(1)访问队列中最大*项目(队列存储*最小*项目,因此最大项目将首先被丢弃,我需要它们来减少操作次数)
  5. 易于实施/理解.理想情况下 - 类似于二元搜索的东西 - 一旦你理解它,你就会永远记住它.
  6. 元素无需以任何方式排序.我只需要保持N遇到的最小值.当我需要它们时,我会立刻访问它们.所以从技术上讲,它不必是一个队列,我只需要存储N个最后的最小值.

我最初考虑使用二进制堆(它们可以通过数组轻松实现),但显然当数组不能再增长时它们表现不佳.链接列表和数组将需要额外的时间来移动东西.stl优先级队列增长并使用动态分配(尽管我可能错了).

那么,还有其他想法吗?

--EDIT--
我对STL实现不感兴趣.由于大量的函数调用,STL实现(由少数人建议)比当前使用的线性阵列慢一点.

我对优先级队列算法感兴趣,而不是实现.

c++ algorithm queue priority-queue

11
推荐指数
2
解决办法
6571
查看次数

具有随机数据访问的压缩矢量/数组类

我想制作"压缩数组"/"压缩矢量"类(详见下文),它允许随机数据访问具有或多或少的恒定时间.

"或多或少的恒定时间"意味着虽然元素访问时间不是恒定的,但是当我接近数组的某个点时它不应该继续增加.即容器不应该做更多的计算(比如"再次解压缩所有内容以获取最后一个元素",并且"几乎不做任何事情来获得第一个")来获得一个元素.可以通过将数组拆分为压缩数据块来实现.即访问一个元素应该采用"averageTime"+ - 一些偏差.我可以说我希望最佳访问时间和最坏情况访问时间相对接近平均访问时间.

我有哪些选择(合适的算法/已有的容器 - 如果有的话)?

货柜详情:

  1. 容器充当相同元素的线性数组(例如std :: vector)
  2. 初始化容器后,数据将保持不变并且永远不会更改.容器需要提供只读访问权限.
  3. 容器应该像array/std :: vector一样 - 即通过operator []访问的值,有.size()等.
  4. 如果我可以将它作为模板类,那将是很好的.
  5. 对数据的访问应该或多或少地保持恒定时间.我不需要每个元素的相同访问时间,但我不应该解压缩所有内容以获取最后一个元素.

用法示例:
对数据进行二进制搜索.

数据详情:
1.数据结构主要由浮点数和几个整数组成.浮点数多于整数.没有字符串.
2.阵列中不太可能存在许多相同的元素,因此无法简单地索引数据.
3.一个元素的大小小于100个字节.
4.每个容器的总数据大小介于几千字节和几兆字节之间.
5.数据不稀疏 - 它是连续的元素块,所有元素都被分配,没有"空槽".

压缩的目标是减少与未压缩表示形式相比较的块所占用的ram量,同时保持一定程度上合理的读取访问性能,并允许随机访问元素作为数组.即数据应该在内部以压缩形式存储,我应该能够访问它(只读),就像它是std :: vector或类似的容器一样.

想法/意见?

c++ compression algorithm data-compression

10
推荐指数
1
解决办法
3078
查看次数

管理外部资源(类似于C++中的RAII?)

在常见的lisp中,管理外部资源(套接字,文件系统句柄等)的首选方法是什么?

我试图在常见的lisp中制作一个简单的opengl 2d平台游戏.问题是我不太确定如何跟踪OpenGL纹理(必须在glDeleteTextures不再需要时删除它们).

在C++中,我更喜欢使用以下方案:

  1. 制作纹理类
  2. 为该纹理类制作智能/弱指针
  3. 将纹理存储在地图(字典/散列表)中,将文件名映射到纹理的弱指针.
  4. 当请求新纹理时,查看map,看看是否有一个非null(零)弱指针可用.如果可用,则返回现有对象,否则加载新纹理.

但是,我不太确定如何将此方案移植到常见的lisp,因为:

  1. 没有破坏者.
  2. 有垃圾收集器,似乎我的实现(windows平台上的clozureCL)支持终结器,但据我所知,不建议在常见的lisp中使用终结器,因为它们不是确定性的.
  3. 管理资源的首选方法在(with-*那里看起来不合适,因为资源可以在函数调用的中间共享和加载/卸载.

据我所知,有几种方法可用:

  1. 放弃自动资源管理,并手动完成.
  2. 使用宏实现类似于C++ RAII,weakpointer和smartpointer的东西(这段代码可能不起作用):

    (defclass destructible () ())
    
    (defmethod destroy ((obj destructible)) (print (format nil "destroy: ~A" obj)))
    
    (defparameter *destructible-classes-list* nil)
    
    (defmethod initialize-instance :after ((obj destructible) &key)
      (progn
          (push *destructible-classes-list* obj)
          (print (format nil "init-instance: ~A" obj))))
    
    (defmacro with-cleanup (&rest body)
      `(let ((*destructible-classes-list* nil))
        (progn ,@body (mapcar (lambda (x) (destroy x)) *destructible-classes-list*))))
    
    (defclass refdata (destructible)
      ((value :accessor refdata-value :initform nil)
       (ref :accessor refdata-ref :initform …
    Run Code Online (Sandbox Code Playgroud)

opengl common-lisp

10
推荐指数
1
解决办法
452
查看次数