我正在学习C++中的函数重载,并遇到了这个问题:
void display(int a)
{
cout << "int" << endl;
}
void display(unsigned a)
{
cout << "unsigned" << endl;
}
int main()
{
int i = -2147483648;
cout << i << endl; //will display -2147483648
display(-2147483648);
}
Run Code Online (Sandbox Code Playgroud)
根据我的理解,该int范围内给出的任何值(在我的情况下int是4个字节)都将调用,display(int)并且该范围之外的任何值都将是不明确的(因为编译器无法决定调用哪个函数).int除了最小值之外,它对整个值范围有效,即-2147483648编译因错误而失败
超载的召唤
display(long int)是模棱两可的
但是将相同的值与a int打印并给出值2147483648.我对这种行为感到困惑.
为什么只有在传递最负数时才会观察到这种行为?(该行为是相同的,如果一个short使用具有-32768-事实上,在负数和正数具有相同的二进制表示任何情况下)
使用的编译器:g ++(GCC)4.8.5
我想知道文字常量实际存储在内存中的哪个位置?
例:
int i = 5;
char* data = char* &("abcdefgh");
Run Code Online (Sandbox Code Playgroud)
存储部分i和data取决于它们的声明位置.但编译器是否存储5并"abcdefgh"在将其实际复制到变量之前?
在这里我可以得到"abcdefgh"它存储位置的地址,但为什么我不能得到它的地址5?
我刚开始从基础知识中学习Cpp,当我遇到参考变量时我很困惑.
根据我所知,参考变量就像一个别名(同一个内存的另一个名称),所以在这种情况下它需要任何内存.
当我运行以下代码时:
class sample_class
{
public:
int num; //line1
int& refnum = num; //line2
}
int main()
{
sample_class sample_object;
cout<< "sample_class object size : " << sizeof(sample_object) <<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我得到的输出为:
sample_class对象大小:8
==>这里,大小为num4个字节(32位编译器),refnum因为引用只是一个别名num.那么,为什么在这种情况下,对象的大小是8?
==>另外,如果真的refnum是一个别名,那么这个信息(refnum同样存储/别名的信息)何时num被存储?
编辑:
并考虑这种情况(changine的定义sample_class):
class sample_class
{
public:
char letter; //line3
char& refletter = letter; //line4
char letter_two; //line5
}
Run Code Online (Sandbox Code Playgroud)
在这里,如果我打印对象的对象大小sample_class,我得到它12(虽然大小letter,refletter并且 …
我理解在旧版本的C++中,const static variable在结构中分配值而不在结构外定义它将不会为变量创建内存分配,但会const static variable在编译期间用其指定的值替换它并访问其中的地址.变量给出错误(因为变量未定义/分配的内存)
struct A{
int i;
static const int j = 20;
}
Run Code Online (Sandbox Code Playgroud)
所以,在这里定义变量,应该用地址来访问它
const int A::j; //line1
Run Code Online (Sandbox Code Playgroud)
但是,在C++的更高版本中,即使变量未定义为line1,也会分配内存并获取其地址.
我不确定line1从C++ 11中添加版本是否会在任何其他方面产生任何差异(因为内存也是在没有此行的情况下分配的).如果它有所作为,会是什么?(它只是提供向后兼容性吗?)
请帮忙!!!
编辑:我不确定在C++ 11之前是否接受了这样的事情,但是因为我从C++ 11中观察到它,我提到它(使用MSVC++ 14.0)
更新:还观察到,当试图打印j的地址没有line1,在MSVC++ 14.0,它可以打印地址,但有gcc compiler (cpp.sh),它不能,它给出一个链接错误(undefined reference).
我正在学习staticC中的变量,并且知道static变量的内存是在编译时分配的(在编译期间需要分配多少内存并且在编译时计算其虚拟地址,在程序加载时分配实际内存)在任一数据中segment/.bss取决于是否已初始化
我在一些网站帖子中看到,由于对象/变量将采用的大小是基于变量类型预定义的,因此内存在编译时分配.但是,如果局部static变量在函数中定义且其范围仅在函数内,我不理解这种情况的必要性.
请考虑以下代码段:
void func()
{
static int i;
/*some logic*/
}
void func1()
{
static int data[10] = {1,2,3,4,5,6,7,8,9,10};
/*some logic*/
}
int main()
{
/*logic not involving func() and func1()*/
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,函数func并func1没有在程序中调用,但是static一旦程序加载(从我学到的)实际上没有使用,就会分配这些函数中的变量的内存.因此,有了这个缺点,为局部static变量分配内存的用途是什么.为什么编译器在通过函数时不能在数据段中为它们分配内存.
我已经经历了关于此的堆栈溢出问题,无法得到确切的答案 请帮助!