Questions tagged «c++»

C ++是一种通用编程语言。它最初被设计为C的扩展,并且具有类似的语法,但是现在它是一种完全不同的语言。使用此标记可解决有关将要使用C ++编译器编译的代码的问题。对于与特定标准修订版[C ++ 11],[C ++ 14],[C ++ 17]或[C ++ 20]等相关的问题,请使用特定于版本的标记。

9
性能问题:Java与C ++
我一直都听说C ++比Java更高效(这就是为什么大多数游戏都是用C ++开发的原因)。 我写了一个小的算法,使用完全相同的算法来解决Java和C ++中的“八皇后难题”,然后开始增加数字或平方。当到达20 * 20甚至22 * 22的棋盘时,似乎Java更为有效(3秒对C ++为66秒)。 我不知道为什么,但是我是从C ++开始的,所以我很可能会犯一些巨大的性能错误,所以我很乐意接受任何可以帮助我了解发生了什么的信息。 以下是我在Java中使用的代码: import java.awt.Point; import java.util.ArrayList; import java.util.List; public class HuitDames { /** * La liste des coordnnées des dames. */ private static List<Point> positions = new ArrayList<>(); /** * Largeur de la grille. */ private static final int …

4
x86汇编中的“锁定”指令是什么意思?
我在Qt的源代码中看到了一些x86程序集: q_atomic_increment: movl 4(%esp), %ecx lock incl (%ecx) mov $0,%eax setne %al ret .align 4,0x90 .type q_atomic_increment,@function .size q_atomic_increment,.-q_atomic_increment 从谷歌搜索,我知道lock指令将导致CPU锁定总线,但是我不知道CPU何时释放总线? 关于上面的整个代码,我不明白该代码如何实现Add?
69 c++  qt  assembly  x86 

5
什么是* .o文件?
我正在编译自己的项目。它因此错误而停止运行: LINK ||致命错误LNK1181:无法打开输入文件'obj \ win \ release \ src \ lua \ bindings.o'| 在Win7下使用Code :: Blocks与VS 2005/2008编译器进行编译。还有很多其他空目录,其中* .o文件丢失。 他们在做什么?
69 c++ 

4
C ++ 11:正确的std :: array初始化吗?
如果我按以下方式初始化std :: array,则编译器会向我发出有关括号丢失的警告 std::array<int, 4> a = {1, 2, 3, 4}; 这样可以解决问题: std::array<int, 4> a = {{1, 2, 3, 4}}; 这是警告消息: missing braces around initializer for 'std::array<int, 4u>::value_type [4] {aka int [4]}' [-Wmissing-braces] 这只是我的gcc版本中的错误,还是故意做的?如果是这样,为什么?

3
长双vs双
我知道各种数据类型的大小可以根据我所使用的系统而变化。我使用XP 32位,并在C ++中使用sizeof()运算符,似乎long double是12个字节,而double是8。 但是,大多数主要来源都指出,long double是8个字节,因此范围与double相同。 我怎么会有12个字节?如果long double的确是12个字节,这是否还会扩展值的范围?还是仅当值超过double的范围,并因此扩展到超过8个字节时才使用long签名(编译器数字)? 谢谢。

5
为什么我的日志在std名称空间中?
在下面的代码中,我定义了一个平凡的log函数。在main我尽量不叫它; 我打电话std::log。然而,我自己log被称为;然后我看到“日志!” 在屏幕上。有人知道为什么吗?我使用G ++ 4.7和clang ++ 3.2。 #include <iostream> #include <cmath> double log(const double x) { std::cout << "log!\n"; return x; } int main(int argc, char *argv[]) { std::log(3.14); return 0; }

6
枚举vs constexpr用于类内部的实际静态常量
让我首先说明我的意图。在较早的(C ++)时代,我们将有如下代码: class C { public: enum {SOME_VALUE=27}; }; 然后,我们可以SOME_VALUE在整个代码中将其用作编译时间常数,并且无论编译器看到什么C::SOME_VALUE,它都只会插入文字27。 现在,将代码更改为以下内容似乎是可以接受的: class C { public: static constexpr int SOME_VALUE=27; }; SOME_VALUE从C ++ 11开始,这看起来更加简洁,给出了定义良好的类型,似乎是首选方法。(至少对我来说是SOME_VALUE无法预料的)问题是,这还会导致需要将其置于外部的情况。也就是说,在某些cpp文件中,我们需要添加: constexpr int C::SOME_VALUE; // Now C::SOME_VALUE has external linkage 导致这种情况的原因似乎是在使用const引用时SOME_VALUE,这种情况在C ++标准库代码中经常发生(请参阅此问题底部的示例)。顺便说一下,我正在使用gcc 4.7.2作为我的编译器。 由于这一难题,我不得不回到定义SOME_VALUE为枚举(即旧派)的方式,以避免为某些但不是全部静态constexpr成员变量向cpp文件中添加定义。难道没有什么办法告诉编译器这constexpr int SOME_VALUE=27意味着SOME_VALUE应该仅将其视为编译时常数,而不应将其视为具有外部链接的对象吗?如果看到与它一起使用的const引用,请创建一个临时引用。如果您看到它的地址,那么就需要生成一个编译时错误,因为这是一个编译时间常数,仅此而已。 以下是一些看似良性的示例代码,这些代码使我们需要SOME_VALUE在cpp文件中添加的定义(再次,用gcc 4.7.2测试): #include <vector> class C { public: static constexpr int SOME_VALUE=5; …
69 c++  c++11  constexpr 

9
如何获取可用内存C ++ / g ++?
我想根据可用内存分配缓冲区。这样,当我进行处理时,内存使用率上升了,但仍然处于可用内存限制之内。有没有一种方法可以获取可用内存(我不知道虚拟或物理内存状态会有所不同吗?)。方法必须与平台无关,因为它必须在Windows,OS X,Linux和AIX上使用。(如果可能的话,我还想为我的应用程序分配一些可用的内存,在执行过程中不会改变的内存)。 编辑:我做到了可配置的内存分配。我知道这不是一个好主意,因为大多数操作系统都为我们管理内存,但是我的应用程序是ETL框架(打算在服务器上使用,但也作为Adobe indesign的插件在桌面上使用)。因此,我遇到了问题,因为Windows会不使用交换而返回错误的alloc,而其他应用程序则会开始失败。正如我被教导要避免崩溃那样,所以,我只是试图优雅地降级。

7
为什么未为C ++ 14数字分隔符选择空格字符?
从C ++ 14开始,由于n3781(它本身不能回答这个问题),我们可以编写如下代码: const int x = 1'234; // one thousand two hundred and thirty four 目的是改进这样的代码: const int y = 100000000; 并使其更具可读性。 下划线(_)字符已经由用户定义的文本采取了C ++ 11,和逗号(,)的本地化问题-许多欧洲国家令人困惑†以此作为小数点分隔符-和冲突与逗号操作,虽然我做的想知道允许使用可能破坏了哪些实际代码1,234,567。 无论如何,更好的解决方案似乎是空格字符: const int z = 1 000 000; 这些相邻的数字文字标记可以和字符串文字一样由预处理器连接: const char x[5] = "a" "bc" "d"; 相反,我们得到撇号('),我所知道的任何书写系统都没有使用它作为数字分隔符。 是否存在选择撇号而不是简单空格的原因? †之所以感到莫名其妙,是因为所有这些语言在文本内都保持着逗号的概念,即“分开”原本原子的句子,并用句号“终结”该句子-至少对我而言,这与逗号“分解”数字的整数部分,并用句号“终止”数字以准备小数输入。

4
使用Makefile在编译中排除源文件
是否可以使用Makefile中的通配符功能在编译过程中排除源文件? 就像有几个源文件一样, src/foo.cpp src/bar.cpp src/... 然后在我的makefile文件中, SRC_FILES = $(wildcard src/*.cpp) 但是我想排除bar.cpp。这可能吗?
69 c++  makefile 


2
从父CMakeLists.txt覆盖CMake中的默认option(…)值
我试图在我的源代码树中包括几个第三方库,并对其构建系统进行最小的更改,以便于升级。他们和我一样都使用CMake,因此我可以在自己的CMakeLists.txt中使用add_subdirectory(extern/foo)libfoo。 但是foo CMakeLists.txt编译了一个测试工具,建立了文档,一个不需要的共享库,等等。libfoo作者具有预见性,可以通过选项(option(FOO_BUILD_SHARED "Build libfoo shared library" ON)例如)来控制它们,这意味着我可以通过CMake命令行进行设置。但是我想默认关闭它,并且可以通过命令行覆盖。 我以前尝试set(FOO_BUILD_SHARED OFF)过add_subdirectory(extern/foo)。这样的效果是,在第二次及以后的构建尝试中不尝试构建共享库,而在第一次构建时则不尝试,这是我真正需要加快的速度。 这可能吗,或者我需要为这些项目维护分叉的CMakeLists.txt吗?

3
不建议使用的标头<codecvt>替换
有点前景:我的任务需要将UTF-8 XML文件转换为UTF-16(当然具有正确的标头)。因此,我搜索了将UTF-8转换为UTF-16的常用方法,发现应该使用中的模板&lt;codecvt&gt;。 但是,现在不赞成使用它,我想知道执行相同任务的新通用方法是什么? (完全不介意使用Boost,但除此之外,我更喜欢尽可能接近标准库。)
69 c++  utf-8  c++17  utf-16  codecvt 

4
目标文件与库文件,为什么?
我了解编译的基础知识。将源文件编译为目标文件,然后链接程序将其链接到可执行文件中。这些目标文件由包含定义的源文件组成。 所以我的问题是: 为什么我们有一个单独的库实现?.a .lib,.dll ... 我可能会弄错,但是在我看来,.o文件本身与库是一样的东西吗? 有人不能给您他们的某个声明(.h)的实现,您可以替换为该声明并将其链接成可执行相同功能但执行不同操作的可执行文件吗?
69 c++ 

4
错误LNK2038:检测到“ _MSC_VER”不匹配:值“ 1600”与CppFile1.obj中的值“ 1700”不匹配
我将项目从VS2010转换为VS2012,但是在某些项目中出现_MSC_VER链接器错误。经过长时间的谷歌浏览后,我发现问题是由于在VS2010中创建的库与VS2012的链接所致。 我如何找出哪个项目导致了错误?在这里,我引用错误: Error 6 error LNK2038: mismatch detected for '_MSC_VER': value '1600' doesn't match value '1700' in CppFile1.obj D:\ProjectLocation\Projectname1.lib(CppFile2.obj) Projectname2 Error 15 error LNK2001: unresolved external symbol "private: static void __cdecl std::locale::facet::_Facet_Register(class std::locale::facet *)" (?_Facet_Register@facet@locale@std@@CAXPAV123@@Z) D:\ProjectLocation\Projectname1.lib(CppFile3.obj) Projectname2 Error 13 error LNK2038: mismatch detected for '_MSC_VER': value '1600' doesn't match value …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.