标签: c++

如何在C++中初始化私有静态成员?

在C++中初始化私有静态数据成员的最佳方法是什么?我在头文件中尝试了这个,但它给了我奇怪的链接器错误:

class foo
{
    private:
        static int i;
};

int foo::i = 0;
Run Code Online (Sandbox Code Playgroud)

我猜这是因为我无法从课外初始化私人成员.那么最好的方法是什么?

c++ initialization static-members

492
推荐指数
11
解决办法
47万
查看次数

哪个更快:堆栈分配或堆分配

这个问题可能听起来相当简单,但这是我与另一位与我合作的开发人员的辩论.

我正在小心处理堆栈分配的东西,而不是堆分配它们.他正在跟我说话,看着我的肩膀并评论说这没有必要,因为他们的表现是明智的.

我一直认为堆栈的增长是恒定的时间,并且堆分配的性能取决于堆的当前复杂性(用于找到合适大小的孔)和解除分配(折叠孔以减少碎片,如如果我没有弄错的话,许多标准库实现在删除期间需要时间来完成此操作.

这让我觉得可能非常依赖于编译器.特别是对于这个项目,我使用Metrowerks编译器来实现PPC架构.对这种组合的洞察力将是最有帮助的,但总的来说,对于GCC和MSVC++,情况如何?堆分配不如堆栈分配高吗?没有区别吗?或者差异是如此微小,它变得毫无意义的微优化.

c++ memory heap performance stack

489
推荐指数
13
解决办法
12万
查看次数

在Visual Studio中使用命令行参数进行调试

我正在Visual Studio中开发一个C++命令行应用程序,需要使用命令行参数进行调试.目前我只使用我需要的参数运行生成的EXE文件(像这样program.exe -file.txt),但这样我无法调试.有什么地方我可以指定调试的参数吗?

c++ debugging command-line visual-studio

487
推荐指数
7
解决办法
36万
查看次数

未命名/匿名命名空间与静态函数

C++的一个特性是能够创建未命名(匿名)命名空间,如下所示:

namespace {
    int cannotAccessOutsideThisFile() { ... }
} // namespace
Run Code Online (Sandbox Code Playgroud)

您会认为这样的功能是无用的 - 因为您无法指定命名空间的名称,所以无法从外部访问其中的任何内容.但是这些未命名命名空间可以在它们创建的文件访问,就好像你有一个隐含的using子句.

我的问题是,为什么或何时使用静态函数会更好?或者他们基本上是两种做同样事情的方式?

c++ namespaces

486
推荐指数
8
解决办法
20万
查看次数

在.CPP文件中存储C++模板函数定义

我有一些模板代码,我宁愿存储在CPP文件中而不是标题中的内联.我知道只要您知道将使用哪些模板类型,就可以完成此操作.例如:

.h文件

class foo
{
public:
    template <typename T>
    void do(const T& t);
};
Run Code Online (Sandbox Code Playgroud)

.cpp文件

template <typename T>
void foo::do(const T& t)
{
    // Do something with t
}

template void foo::do<int>(const int&);
template void foo::do<std::string>(const std::string&);
Run Code Online (Sandbox Code Playgroud)

注意最后两行--foo :: do模板函数仅用于int和std :: strings,因此这些定义意味着应用程序将链接.

我的问题是 - 这是一个讨厌的黑客还是会与其他编译器/链接器一起使用?我目前只在VS2008上使用此代码,但是想要移植到其他环境.

c++ templates

484
推荐指数
8
解决办法
31万
查看次数

C++标准是否允许未初始化的bool使程序崩溃?

我知道C++ 中的"未定义行为"几乎可以让编译器做任何想做的事情.但是,我遇到了让我感到惊讶的崩溃,因为我认为代码足够安全.

在这种情况下,真正的问题仅发生在使用特定编译器的特定平台上,并且仅在启用了优化时才发生.

我尝试了几件事来重现问题并将其简化到最大程度.这是一个名为的函数的摘录Serialize,它将获取bool参数,并将字符串true或复制false到现有的目标缓冲区.

如果bool参数是未初始化的值,那么这个函数是否会在代码审查中,没有办法告诉它实际上可能会崩溃?

// Zero-filled global buffer of 16 characters
char destBuffer[16];

void Serialize(bool boolValue) {
    // Determine which string to print based on boolValue
    const char* whichString = boolValue ? "true" : "false";

    // Compute the length of the string we selected
    const size_t len = strlen(whichString);

    // Copy string into destination buffer, which is zero-filled (thus already null-terminated)
    memcpy(destBuffer, whichString, len);
}
Run Code Online (Sandbox Code Playgroud)

如果使用clang 5.0.0 +优化执行此代码,它将/可能崩溃.

boolValue ? "true" …

c++ abi llvm undefined-behavior llvm-codegen

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

unsigned int vs. size_t

我注意到现代的C和C++代码似乎size_t代替int/ unsigned int几乎无处不在 - 从C字符串函数的参数到STL.我很好奇这个原因及其带来的好处.

c c++ size-t

478
推荐指数
5
解决办法
20万
查看次数

int argc,char*argv []是什么意思?

在许多C++ IDE和编译器中,当它为您生成主函数时,它看起来像这样:

int main(int argc, char *argv[])
Run Code Online (Sandbox Code Playgroud)

当我在没有IDE的情况下编写C++代码时,只需使用命令行编译器,我输入:

int main()
Run Code Online (Sandbox Code Playgroud)

没有任何参数.这意味着什么,对我的计划至关重要?

c++ parameters argv command-line-arguments argc

476
推荐指数
8
解决办法
81万
查看次数

我什么时候应该使用noexcept?

noexcept关键字可以适当地应用于许多功能签名,但我不能确定何时我应该考虑在实践中使用它.根据我到目前为止所读到的内容,最后一分钟的添加noexcept似乎解决了移动构造函数抛出时出现的一些重要问题.但是,我仍然无法对一些实际问题提供令人满意的答案,这些问题使我首先要了解更多信息noexcept.

  1. 我知道永远不会抛出许多函数的例子,但编译器无法自行确定.noexcept所有这些情况下我应该附加到函数声明吗?

    不得不考虑我是否需要noexcept每个函数声明之后追加,这将大大降低程序员的工作效率(坦率地说,这将是一个痛苦的屁股).对于哪些情况,我应该更加小心使用noexcept,以及在哪些情况下我可以使用暗示noexcept(false)

  2. 我何时才能真实地期望在使用后观察到性能提升noexcept?特别是,给出一个代码示例,C++编译器在添加之后能够生成更好的机器代码noexcept.

    就个人而言,我关心的是noexcept因为编译器提供了更大的自由来安全地应用某些类型的优化.现代编译器是否noexcept以这种方式利用?如果没有,我可以期待他们中的一些人在不久的将来这样做吗?

c++ exception-handling exception noexcept c++11

472
推荐指数
8
解决办法
9万
查看次数

为什么这个程序被三个C++编译器错误地拒绝了?

编写我编写的C++程序时遇到一些困难.

这个程序非常简单,据我所知,它符合C++标准中规定的所有规则.我已经两次阅读整个ISO/IEC 14882:2003以确定.

该计划如下:

在此输入图像描述

这是我尝试使用Visual C++ 2010编译此程序时收到的输出:

c:\dev>cl /nologo helloworld.png
cl : Command line warning D9024 : unrecognized source file type 'helloworld.png', object file assumed
helloworld.png : fatal error LNK1107: invalid or corrupt file: cannot read at 0x5172
Run Code Online (Sandbox Code Playgroud)

沮丧,我尝试了g ++ 4.5.2,但同样无益:

c:\dev>g++ helloworld.png
helloworld.png: file not recognized: File format not recognized
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

我认为Clang(版本3.0主干127530)必须工作,因为它的标准一致性受到高度赞扬.不幸的是,它甚至没有给我一个漂亮的,突出显示的错误消息:

c:\dev>clang++ helloworld.png
helloworld.png: file not recognized: File format not recognized
collect2: ld returned 1 exit status
clang++: error: linker (via gcc) command …
Run Code Online (Sandbox Code Playgroud)

c++ compiler-errors clang visual-c++

469
推荐指数
30
解决办法
32万
查看次数