小编pra*_*ash的帖子

C++中指针变量和引用变量之间有什么区别?

我知道引用是语法糖,因此代码更容易读写.

但有什么区别?


以下答案和链接摘要:

  1. 指针可以重新分配任意次数,而在绑定后无法重新分配引用.
  2. 指针可以指向nowhere(NULL),而引用总是指对象.
  3. 您不能使用指针来获取引用的地址.
  4. 没有"参考算术"(但您可以获取引用所指向的对象的地址,并对其进行指针运算&obj + 5).

澄清一个误解:

C++标准非常谨慎,以避免规定编译器如何实现引用,但每个C++编译器都将引用实现为指针.也就是说,声明如下:

int &ri = i;
Run Code Online (Sandbox Code Playgroud)

如果它没有完全优化,则分配与指针相同的存储量,并将地址i放入该存储中.

因此,指针和引用都使用相同数量的内存.

作为基本规则,

  • 使用函数参数和返回类型中的引用来提供有用的自我文档化接口.
  • 使用指针实现算法和数据结构.

有趣的读物:

c++ pointers reference c++-faq

3115
推荐指数
34
解决办法
94万
查看次数

'foo'到底意味着什么?

我希望这有资格作为一个编程问题,就像在任何编程教程中一样,你最终会在代码示例中遇到'foo'.(是的,对吧?)

'foo'到底意味着什么?

如果它意味着什么都没有,它何时开始被使用呢?

language-agnostic coding-style

226
推荐指数
6
解决办法
14万
查看次数

如何检测/避免(非托管)代码中的内存泄漏?

在非托管C/C++代码中,检测内存泄漏的最佳实践是什么?和编码指南,以避免?(好像就这么简单;)

过去我们使用了一些愚蠢的方法:每次内存分配调用都有一个计数器增量,而在释放时减少.在程序结束时,计数器值应为零.

我知道这不是一个很好的方式,有一些捕获.(例如,如果释放由平台API调用分配的内存,则分配计数将与您的释放计数不完全匹配.当然,我们在调用分配内存的API调用时递增计数器.)

我期待您的经验,建议和一些简化此工具的工具参考.

c c++ memory-leaks

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

如何检查给定的字符串是否是回文?

定义:

回文是单词,短语,数字或其他单元序列,具有在任一方向上读取相同的属性

如何检查给定的字符串是否是回文?

这是前一段时间的FAIQ [常见问题访谈问题]之一,但主要是使用C.

寻找任何和所有语言的解决方案.

language-agnostic string

56
推荐指数
15
解决办法
13万
查看次数

生成字谜的算法

什么是产生字谜的最佳策略.

An anagram is a type of word play, the result of rearranging the letters
of a word or phrase to produce a new  word or phrase, using all the original
letters exactly once; 
ex.
Run Code Online (Sandbox Code Playgroud)
  • 十一加二十二加一的字谜
  • 小数点我是一个圆点的字谜
  • 天文学家月球凝视者的字谜

起初它看起来很简单,只是混杂字母并生成所有可能的组合.但是,只生成字典中的单词的有效方法是什么呢?

我遇到了这个页面,在Ruby中解决了字谜.

但你有什么想法?

language-agnostic puzzle algorithm

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

C#中的IPC机制 - 用法和最佳实践

我刚刚在win32代码中使用过IPC.[关键部分,事件和信号量]

.NET环境中的场景如何?是否有任何教程解释所有可用的选项以及何时使用以及为什么?

.net c# ipc

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

如何用可变长度参数包装函数?

我希望用C/C++做到这一点.

我遇到了可变长度参数,但这表明使用libffi的 Python和C解决方案.

现在,如果我想用printf函数包装myprintf

我的工作如下:

void myprintf(char* fmt, ...)
{
    va_list args;
    va_start(args,fmt);
    printf(fmt,args);
    va_end(args);
}

int _tmain(int argc, _TCHAR* argv[])
{
    int a = 9;
    int b = 10;
    char v = 'C';
    myprintf("This is a number: %d and \nthis is a character: %c and \n another number: %d\n",a, v, b);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但结果不如预期!

This is a number: 1244780 and
this is a character: h and
another number: 29953463
Run Code Online (Sandbox Code Playgroud)

我错过的任何一点?

c c++ variadic-functions

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

磁盘支持的STL容器类?

我喜欢使用STL开发算法,但是,我有这个反复出现的问题,我的数据集对于堆来说太大了.

我一直在寻找支持磁盘的STL容器和算法的直接替换,即存储在磁盘而不是堆上的数据结构.

一位朋友最近向我指出了stxxl.在我太介入之前......我应该考虑使用其他任何支持磁盘的STL替换吗?

注意:我对持久性或嵌入式数据库不感兴趣.请不要提及boost :: serialization,POST ++,Relational Template Library,Berkeley DB,sqlite等.我知道这些项目并在它们适合我的目的时使用它们.

更新:有几个人提到了内存映射文件和使用自定义分配器,BTW提出了很好的建议,但我想指出他们在这里讨论David Abraham建议磁盘支持的容器需要自定义迭代器.这意味着自定义分配器方法不太可行.

c++ algorithm stl on-disk data-structures

39
推荐指数
2
解决办法
5674
查看次数

使用内联函数有什么问题?

虽然在某些情况下使用内联函数会非常方便,

内联函数有什么缺点吗?

结论:

显然,使用内联函数没有任何问题.

但值得注意的是以下几点!

  • 过度使用内联实际上可以使程序变慢.根据函数的大小,内联它可能会导致代码大小增加或减少.内联一个非常小的访问器函数通常会减少代码大小,而内联一个非常大的函数可以大大增加代码大小.在现代处理器上,较小的代码通常由于更好地使用指令缓存而运行得更快. - Google指南

  • 随着函数大小的增加,内联函数的速度优势趋于减小.在某些时候,与函数体的执行相比,函数调用的开销变小,并且失去了好处- Source

  • 内联函数可能无法正常工作的情况很少:

    • 对于返回值的函数; 如果存在return语句.
    • 对于不返回任何值的函数; 如果存在循环,开关或goto语句.
    • 如果函数是递归的.-资源
  • __inline仅当指定optimize选项时,关键字才会使函数内联.如果指定了optimize,则是否__inline遵循优先级取决于内联优化程序选项的设置.默认情况下,只要运行优化程序,内联选项就会生效.如果指定optimize,则还必须指定noinline选项(如果要__inline忽略关键字).-资源

c++ inline-functions

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

有没有使用带参考参数的varargs

我有这段代码(总结)......

AnsiString working(AnsiString format,...)
{
    va_list argptr;
    AnsiString buff;

    va_start(argptr, format);
    buff.vprintf(format.c_str(), argptr);

    va_end(argptr);
    return buff;
}
Run Code Online (Sandbox Code Playgroud)

并且,在可能的情况下优先考虑通过参考,我因此改变了它.

AnsiString broken(const AnsiString &format,...)
{
... the rest, totally identical ...
}
Run Code Online (Sandbox Code Playgroud)

我的主叫代码是这样的: -

AnsiString s1, s2;
    s1 = working("Hello %s", "World");
    s2 = broken("Hello %s", "World");
Run Code Online (Sandbox Code Playgroud)

但是,s1包含"Hello World",而s2包含"Hello(null)".我认为这是由于va_start的工作方式,但我不确定是怎么回事.

c++ reference variadic-functions

29
推荐指数
2
解决办法
8910
查看次数