小编Mar*_* Ba的帖子

用于(在不同平台上)的NDEBUG预处理器宏是什么?

我对各种平台/编译器("实现")/框架分配给C和C++预处理器宏的目的感兴趣NDEBUG.

Ç以及C++标准只提及这个定义一次,即控制的行为assert()宏.

我会要求只包含特定的答案,您知道C或C++ 的某个平台/框架/库使用该NDEBUG定义来启用或禁用除标准定义的assert()宏之外的任何其他内容.

提出这个问题的一个原因是MS(Visual-C++)总是(?)使用"他们的" _DEBUG定义来区分调试和发布内容,我想知道这是否是图书馆/平台的常见做法"自己的"调试定义或其他库/平台是否NDEBUG用于调试相关的东西.

c c++ cross-platform ndebug c-preprocessor

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

空序列的算术平均值是多少?

免责声明:不,我没有找到任何明显的答案,与我的预期相反!

在寻找代码示例时.算术平均值,我可以通过谷歌调出的前几个例子似乎被定义为空序列产生的平均值0.0.(例如,这里这里 ......)

然而,看一下维基百科,算术平均值被定义为空序列会产生0.0 / 0-

 A = 1/n ?[i=1 -> n](a[i])
Run Code Online (Sandbox Code Playgroud)

- 所以,可能一般情况下的NaN.

因此,如果我编写一个计算一组浮点值的算术平均值的效用函数,我应该在一般情况下:

  • 返回0.空序列?
  • 返回(Q)NaN空序列?
  • 在空序列的情况下"抛出异常"?

c++ math floating-point nan

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

Visual Studio:项目不是最新的"因为"指定了AlwaysCreate"?

我已经将VS2008的解决方案迁移到了VS2010(SP1).
现在,我的一个项目从来没有找到最新的和平.每个构建都有以下输出:

1>------ Build started: Project: PROJ_NAME, Configuration: Release Win32 ------
1>Build started 19/05/2011 7:59:27 AM.
1>InitializeBuildStatus:
1>  Creating "Release\PROJ_NAME.unsuccessfulbuild" because "AlwaysCreate" was specified.
1>ClCompile:
1>  All outputs are up-to-date.
1>  All outputs are up-to-date.
1>Lib:
1>  All outputs are up-to-date.
1>  PROJ_NAME.vcxproj -> C:\projFolder.PROJ_NAME.lib
1>FinalizeBuildStatus:
1>  Deleting file "Release\PROJ_NAME.unsuccessfulbuild".
1>  Touching "Release\PROJ_NAME.lastbuildstate".
1>
1>Build succeeded.
1>
1>Time Elapsed 00:00:00.09
========== Build: 1 succeeded, 0 failed, 5 up-to-date, 0 skipped ==========
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

c++ msbuild visual-studio-2010 visual-studio visual-studio-2015

35
推荐指数
3
解决办法
4万
查看次数

std :: bitset如何比std :: vector <bool>更快?

根据这个答案,海报期望std::bitset大小100k位比std::vector<bool>查询单个位时更快.这怎么可能?

如果std::bitset显然允许任意大小,他们甚至可能在实施方面有显着差异std::vector

c++

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

为什么从构造函数参数中删除“const”会阻止类被实例化?

从第 12 行删除const可以防止该类What在编译期间被实例化。What无论声明中的常量如何,我都不希望被实例化。这在 clang、gcc 和 MSVC 之间是一致的,所以我认为它是标准的。标记构造函数explicit也不会阻止实例化。我在这里不明白什么?为什么常量会产生影响?

template <typename T> constexpr bool just_false() { return false; }

template<typename T>
class What {
    static_assert(just_false<T>(), "Why was this class instantiated?");
};

struct The {};

struct Heck {
    Heck(The) {}
    Heck(const What<int>&); // Removing 'const' from this line stops 'What<int>' from being instantiated
};

int main() {
    The the;
    Heck{the};
}
Run Code Online (Sandbox Code Playgroud)

just_false咒语只是为了防止静态断言始终触发,无论实例化如何。

编译器浏览器链接:https ://godbolt.org/z/8cETcfss5

c++ constructor c++17

34
推荐指数
2
解决办法
3748
查看次数

ESP和EBP之间有什么关系?

是的,我确信这已被多次隐含地回答,但我似乎无法完全理解它.

如果你有一个(x86)堆栈跟踪(比如,在WinDbg中查看它),并且你看一下寄存器,那么EBP和ESP值相隔x个字节意味着什么?

链接:

举一个最近的堆栈跟踪示例,我有:

0:016> k
ChildEBP RetAddr  
1ac5ee8c 76b831bb ntdll!NtDelayExecution+0x15
1ac5eef4 76b83a8b KERNELBASE!SleepEx+0x65
1ac5ef04 0060e848 KERNELBASE!Sleep+0xf
1ac5ef10 76859d77 MyApp!application_crash::CommonUnhandledExceptionFilter+0x48 [...\applicationcrash.inc.cpp @ 47]
1ac5ef98 775a0df7 kernel32!UnhandledExceptionFilter+0x127
1ac5efa0 775a0cd4 ntdll!__RtlUserThreadStart+0x62
1ac5efb4 775a0b71 ntdll!_EH4_CallFilterFunc+0x12
1ac5efdc 77576ac9 ntdll!_except_handler4+0x8e
1ac5f000 77576a9b ntdll!ExecuteHandler2+0x26
1ac5f0b0 7754010f ntdll!ExecuteHandler+0x24
1ac5f0b0 6e8858bb ntdll!KiUserExceptionDispatcher+0xf
1ac5f400 74e68ed7 mfc80u!ATL::CSimpleStringT<wchar_t,1>::GetString [f:\dd\vctools\vc7libs\ship\atlmfc\include\atlsimpstr.h @ 548]
1ac5fec0 6e8c818e msvcr80!_NLG_Return [F:\dd\vctools\crt_bld\SELF_X86\crt\prebuild\eh\i386\lowhelpr.asm @ 73]
1ac5ff48 74e429bb mfc80u!_AfxThreadEntry+0xf2 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\thrdcore.cpp @ 109]
1ac5ff80 74e42a47 msvcr80!_callthreadstartex+0x1b [f:\dd\vctools\crt_bld\self_x86\crt\src\threadex.c @ 348]
1ac5ff88 76833677 msvcr80!_threadstartex+0x66 [f:\dd\vctools\crt_bld\self_x86\crt\src\threadex.c @ 326]
1ac5ff94 77569f02 kernel32!BaseThreadInitThunk+0xe …
Run Code Online (Sandbox Code Playgroud)

debugging x86 stack cpu-registers visual-c++

30
推荐指数
1
解决办法
7万
查看次数

项目参考的"复制本地"是否可传递?

WRT.拟议的欺骗:由于这里的问题暗示了相关的问题,我宁愿认为这不是一个骗局.

首先,我确实阅读了"复制本地"和项目参考的最佳实践是什么?(也是这个)我无论如何都要试试这个,但是得到一般反馈似乎是必要的,因为关于这个东西的文档非常糟糕,我只是在VS2010上,也许他们在新版本中改变了一些东西很高兴知道.

其次,我只对这个问题的项目引用感兴趣,因为我读过GAC的程序集处理方式不同而GAC与我的问题无关.

第三,在阅读了建议的欺骗之后,但更多的是@Albireo这里的好答案,它似乎也很重要,区分文件依赖,其中依赖引用dll汇编文件和项目依赖(即我问的是什么) about),其中依赖项引用项目并隐式引用该项目的输出文件.

无论如何,这是我认为有点奇怪的情况,但仍然:

  • 2个C#可执行项目
  • n C#dll组装项目
  • 这两个可执行文件具有不同的输出目录,因为它们将单独部署,并且它们在开发人员计算机上也是分开的
  • 这两个可执行文件依赖于某些DLL程序集(可能相互依赖)
  • 有三个输出目录:
    • /x1 可执行1项目
    • /x2 对于可执行2项目
    • /lib 对于所有的dll程序集

该DLL组件已经Copy Local设置false了自己的项目引用,因为它们都建立在相同的输出目录.

2个可执行项目已设置Copy Localtrue所有他们直接引用的DLL组件项目引用,这样的DLL将被复制到/x1 /x2分别.

现在的问题是.到被DLL文件不能直接通过一个可执行的项目引用,但传递地通过引用的程序集:请问组件,这是只有通过其他组件引用传递性,被复制到输出文件夹的可执行文件的,当"复制本地" 设定为第一次装配时是真的吗?

例: …

.net c# msbuild copy-local visual-studio

30
推荐指数
2
解决办法
7085
查看次数

我们通常应该使用浮点文字来表示浮点数而不是更简单的双重文字吗?

在C++中(或者只有我们的编译器VC8和VC10) 3.14是双字面文并且3.14f是浮点字面值.

现在我有一位同事说:

我们应该使用float-literals进行浮点计算,使用double-literals进行双重计算,因为在计算中使用常量时,这可能会影响计算的精度.

具体来说,我认为他的意思是:

double d1, d2;
float f1, f2;
... init and stuff ...
f1 = 3.1415  * f2;
f1 = 3.1415f * f2; // any difference?
d1 = 3.1415  * d2;
d1 = 3.1415f * d2; // any difference?
Run Code Online (Sandbox Code Playgroud)

或者,由我添加,甚至:

d1 = 42    * d2;
d1 = 42.0f * d2; // any difference?
d1 = 42.0  * d2; // any difference?
Run Code Online (Sandbox Code Playgroud)

更一般地,只有我可以看到用点2.71828183f是确保我试图不断的指定实际上将放入一个浮动(编译错误/警告其他方式).

有人可以对此有所了解吗?你指定f后缀吗?为什么?

从答案中引用我隐含的理所当然:

如果你正在使用float变量和double literal,整个操作将以double形式完成,然后转换回float.

可能有任何伤害吗?(除了非常非常理论的性能影响?) …

c++ floating-point double literals

29
推荐指数
3
解决办法
8437
查看次数

重新定义DLL(或提供适当的默认加载地址)是值得的吗?

重新绑定DLL意味着修复DLL,这是首选的加载地址是Loader实际上能够加载DLL的加载地址.

这可以通过诸如Rebase.exe或通过为所有(自己的)dll指定默认加载地址等工具来实现,以便它们"适合"您的可执行进程.

以这种方式管理DLL基地址的重点是加速应用程序负载.(或者我理解.)

现在的问题是:值得麻烦吗?

我有Richter/Nazarre的Windows via C/C++一书,他们强烈建议[a]确保加载地址全部匹配,以便Loader不必重新加载加载的DLL.

但是,如果这样可以将应用程序加载时间加快到任何显着的数量,他们就无法争辩.

此外,对于ASLR,它似乎有任何价值,因为负载地址无论如何都是随机的.

关于这个的利弊是否有任何确凿的事实

[a]:在我的WvC++/5th ed中,它位于第568ff页的标题为Rebasing Modules and Binding Modules的部分.在第20章,DLL高级技巧.

c c++ windows dll

27
推荐指数
2
解决办法
4407
查看次数

C++的std map插入语义的基本原理?

std::map::insert的语义让我有些困惑.我的意思是,我不是在抱怨 - 标准是标准,API就是这样.仍然,

insert

插入操作检查插入的每个元素是否已经在具有相同键值的容器中存在另一个元素,如果是,则不插入该元素,并且不以任何方式更改其映射值.

而且 - 只有在它的单参数版本中pair<iterator,bool> insert ( const value_type& x );它甚至会告诉你它是否甚至将(新的,可能不同的)值插入到键中.据我所知,如果密钥已经存在,迭代器版本将默默地忽略插入.

对我来说,这只是反直觉,我原本期望值部分被覆盖,旧值部分在插入时被丢弃.显然,STL的设计者有不同的想法 - 任何人都知道(历史)的基本原理,或者能够彻底解释现有语义如何(更有意义)?

举例:

在单键映射中实现插入有几种基本方法,例如std::map:

  • 插入,替换,如果已经存在
  • insert,如果已经存在则忽略(这是std :: map的行为)
  • 插入,抛出错误,如果已经存在
  • 插入,UB如果已经存在

我现在试图理解为什么insert_or_ignoreinsert_or_replace(或insert_or_error)更有意义!


我查看了我的TC++ PL副本(不幸的是我只有德语版),有趣的是,Stroustrup在第17.4.1.7章(地图列表操作)中写道:(抱歉粗略翻译德语)

(...)通常情况下,在调用insert()(...)之前,人们不关心是否新插入了密钥(sic!)或已经存在密钥(sic!)

在我看来,它只适用于集合,而不适用于地图,因为对于地图,如果插入了提供的值或旧的遗留在地图中,它确实会产生很大的差异.(这显然与密钥无关,因为密钥是等效的.)


注意:我知道operator[]并且我知道有效STL的第24项和那里提出的efficientAddOrUpdate功能.我只是对insert语义的理由感到好奇,因为我个人觉得它们反直觉.

c++ map standard-library

25
推荐指数
2
解决办法
1919
查看次数