显然,维基百科有关于该主题的大量信息,但我想确保我理解.从我可以告诉它的重要性来理解堆栈/堆关系真正了解内存泄漏?
所以这就是我(我想)的理解.更正是非常受欢迎的!
首次启动程序时,会分配一块内存,例如0x000到0xFFF.第一部分(比如0x000到0x011)是加载程序代码的代码/文本段.
+--------------+ 0x011
| Program Code |
+--------------+ 0x000
Run Code Online (Sandbox Code Playgroud)
然后你有堆栈(比如0x012到0x7ff)保存局部变量,它们被存储/检索FIFO.所以,如果你有类似的东西
char middleLetter(string word){
int len = word.length();
return word[len/2];
}
int main(){
int cool_number;
char letter;
letter = middleLetter("Words");
...
Run Code Online (Sandbox Code Playgroud)
然后你的变量将被分配在堆栈上,如下所示:
+-------------+ 0x7ff
| |
| |
| |
| ... |
| len |
| letter |
| cool_number |
+-------------+ 0x012
Run Code Online (Sandbox Code Playgroud)
当然,如果你在某处(使用malloc或new)分配内存,但从不释放它,那么你的堆可能看起来像这样,你现在有内存泄漏:
+-------------+ 0xfff
| |
| malloc(20) | 0xf64
| malloc(50) | 0xf32
| malloc(50) | 0xf00
| ... …Run Code Online (Sandbox Code Playgroud) 该标准不允许这样的代码:
namespace Hello::World {
//Things that are in namespace Hello::World
}
Run Code Online (Sandbox Code Playgroud)
而是要求
namespace Hello { namespace World {
//Things that are in namespace Hello::World
}}
Run Code Online (Sandbox Code Playgroud)
理由是什么?这当时根本没有想到,还是有一个特定的原因不包括在内?
似乎第一个语法更直接地表达了应该在哪个命名空间中,因为声明模仿了以后代码中命名空间的实际使用.如果你不幸使用"哑"括号计算缩进工具,它也会减少缩进.
似乎递归下降解析器不仅是最简单的解释,而且最简单的设计和维护.它们不仅限于LALR(1)语法,并且代码本身可以被凡人理解.相比之下,自下而上的解析器对它们能够识别的语法有限制,并且需要由特殊工具生成(因为驱动它们的表几乎不可能手动生成).
那么为什么自下而上(即shift-reduce)解析比自上而下(即递归下降)解析更常见?
维基百科对ZIP文件格式有很好的描述,但"中心目录"结构让我感到困惑.特别是这个:
这种排序允许在一次传递中创建ZIP文件,但通常通过首先读取最后的中心目录来解压缩.
问题是即使中央目录的尾部标题也是可变长度.那么,有人可以得到解析中心目录的开头吗?
(哦,我确实花了一些时间看着APPNOTE.TXT,然后来到这里询问:P)
考虑以下程序:
// http://ideone.com/4I0dT
#include <limits>
#include <iostream>
int main()
{
int max = std::numeric_limits<int>::max();
unsigned int one = 1;
unsigned int result = max + one;
std::cout << result;
}
Run Code Online (Sandbox Code Playgroud)
和
// http://ideone.com/UBuFZ
#include <limits>
#include <iostream>
int main()
{
unsigned int us = 42;
int neg = -43;
int result = us + neg;
std::cout << result;
}
Run Code Online (Sandbox Code Playgroud)
+运算符如何"知道"返回哪个正确的类型?一般的规则是把所有的参数转换为最广泛的类型,但在这里没有明确的"赢家"之间int和unsigned int.在第一种情况下,unsigned int必须选择作为结果operator+,因为我得到了结果2147483648.在第二种情况下,它必须选择int,因为我得到了结果-1.然而,在一般情况下,我没有看到这是如何可判定的.这是我看到的未定义的行为还是其他什么?
我正在为128位数字的长流写一个压缩器.我想将数字存储为差异 - 仅存储数字之间的差异而不是数字本身,因为我可以将差异打包在更少的字节中,因为它们更小.
但是,对于压缩,我需要减去这些128位值,对于解压缩,我需要添加这些值.我的编译器的最大整数大小是64位宽.
任何人有任何想法有效地做到这一点?
我们有:
std::plus (+)std::minus(-)std::multiplies(*)std::divides(/)std::modulus(%)std::negate(-)std::logical_or(||)std::logical_not(!)std::logical_and(&&)std::equal_to(==)std::not_equal_to(!=)std::less(<)std::greater(>)std::less_equal(<=)std::greater_equal(>=)我们没有仿函数:
& (地址)的* (解引用)[],~,&,|,^,<<,>> …C++(和C,虽然它更重要)标准状态,程序中的所有翻译单元需要具有相同的定义; 这包括编译器开关之类的东西.例如,在MSVC++中,必须链接到C运行时库的正确版本(/MT对/MD与/MTd对/MDd所有翻译单元).
但是,我们想要使用几个第三方依赖项,并且有几件事情:
/MD和/MDd,而另一种力量/MT和/MTd)我们不确定处理这类事情的最佳方法是什么.我们讨论了以下选项:
我们不知道该怎么办; 我们无法相信我们一个人就有这些问题.我们应该选择上述选项之一,还是我没想过的第三种选择?
这对我来说似乎很奇怪 - VB.NET通过其RaiseEvent关键字隐式处理空检查.它似乎大大增加了围绕事件的样板数量,我看不出它提供了什么好处.
我确信语言设计师有充分的理由这样做..但我很好奇,如果有人知道为什么.
c++ ×6
128-bit ×1
c ×1
c# ×1
dependencies ×1
events ×1
file-format ×1
functor ×1
header-only ×1
integer ×1
memory-leaks ×1
namespaces ×1
null ×1
overflow ×1
parsing ×1
rationale ×1
stl ×1
zip ×1