考虑以下计划:
#include <iostream>
class T {
char c;
int i;
};
int main() {
std::cout<<sizeof(T)<<'\n';
}
Run Code Online (Sandbox Code Playgroud)
8由于对齐,它将输出作为预期.C++编译器添加3个字节的填充.但如果我用D语言做同样的事情,它会给我完全意想不到的输出.(在这里查看现场演示.)
import std.stdio;
class T {
char c;
int i;
}
int main() {
writefln("sizeof T is %d",T.sizeof);
writefln("sizeof char is %d",char.sizeof);
writefln("sizeof int is %d",int.sizeof);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我得到的输出是:
sizeof T is 4
sizeof char is 1
sizeof int is 4
Run Code Online (Sandbox Code Playgroud)
sizeof(T)4怎么样?我期待得到8作为班级规模的输出. D编译器如何在这里执行对齐?我错了什么吗?我正在使用Windows 7 32位OS和Dmd编译器.
考虑以下程序.我不小心弄错了.
struct T {
int s;
T() : T() {
s=9;
}
};
int main() {
T t;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码在某些版本的g ++中编译和运行,如g ++ 4.8.1(请参阅此处的实时演示)&clang ++ 3.6.0(请参阅此处的实时演示)和MSVC++ 2015,但在运行时崩溃.它给了我分段错误错误.我认为这是由于递归我的意思是递归调用构造函数.但是最新版本的g ++&clang ++无法通过提供以下错误来编译此代码:
g ++ 4.9.2给出以下错误(请参阅此处的实时演示)
prog.cc: In constructor 'T::T()':
prog.cc:3:10: error: constructor delegates to itself
T() : T() {
Run Code Online (Sandbox Code Playgroud)
clang ++给出以下错误(请参阅此处的在线演示)
main.cpp:4:8: error: constructor for 'T' creates a delegation cycle [-Wdelegating-ctor-cycles]
T() : T() {
^
1 error generated.
Run Code Online (Sandbox Code Playgroud)
那么,这里的问题是根据标准,哪个编译器就在这里?这是其中一个编译器的错误吗?上面的程序究竟发生了什么?纠正我如果我在理解的某个地方错了.为什么同一程序在这些编译器的不同版本中表现出不同的行为?
c++ constructor language-lawyer c++11 delegating-constructor
这个问题的答案在以下代码中说明:
#include <vector>
using std::vector;
struct foo {
template<typename U>
void vector();
};
int main() {
foo f;
f.vector<int>(); // ambiguous!
}
Run Code Online (Sandbox Code Playgroud)
main中的最后一行是不明确的,因为编译器不仅在vector内部查找foo,而且从内部开始作为非限定名称main.所以它找到了std::vector和foo::vector.要解决这个问题,你必须写
f.foo::vector<int>();
Run Code Online (Sandbox Code Playgroud)
我已经试过所有流行的C++编译器(这个程序g++,clang++,vc++和英特尔C++)和所有的编译器编译这个程序没有任何错误.那么,为什么他说这个程序有歧义呢?C++标准对此有何看法?
class A {
public :
void printSometext() {
std::cout << "printing A" << std::endl;
}
};
class B {
public :
void printSometext() {
std::cout << "printing B" << std::endl;
}
};
int main() {
A* a = new A();
a->printSometext();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
C++对象如何保存有关其成员函数的信息.让我们考虑上面的代码.当我在对象"a"上调用printSometext时,它如何知道要调用的函数以及它如何找到正确的方法.打印对象的大小时,它会打印其成员变量的总和大小(+ allignments).因此,请提供一些内部信息,了解成员函数调用的方式.
谢谢,Deimus
很抱歉提出这个问题,但实际上我不知道这个问题.我在下面的FAQ条目中读过: 我可以使用new分配free()指针吗?我可以删除用malloc()分配的指针吗?
此外,无法保证new和delete用于获取和释放原始内存的机制与
malloc()和兼容free().
我只是想知道这是什么"原始记忆"?
我编写了一个简单的C程序,我希望它在编译时会失败但不幸的是它在C中编译并运行良好,但在C++编译时失败了.考虑以下计划:
#include <stdio.h>
int main()
{
char *c=333;
int *i=333;
long *l=333;
float *f=333;
double *d=333;
printf("c = %u, c+1 = %u",c,c+1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
访问此链接:http://ideone.com/vnKZnx
我认为由于C++的强类型检查,这个程序肯定无法在C++中编译.为什么这个程序用C编译?事实上,编译器也会显示警告.我正在使用Orwell Dev C++ IDE(gcc 4.8.1编译器).我也在其他编译器(Borland Turbo C++ 4.5)上尝试了相同的程序,通过扩展名.c保存它,并且在这个编译器上它无法编译.
我最近在阅读C&C++中的堆栈和堆损坏.该网站的作者使用以下示例演示了堆栈损坏.
#include<stdio.h>
int main(void)
{
int b = 10;
int a[3];
a[0] = 1;
a[1] = 2;
a[2] = 3;
printf(" b = %d \n",b);
a[3] = 12; // oops it is invalid, behaviour is undefined
printf(" b = %d \n",b);
printf("address of b= %x\n",&b);
printf("address of a[3]= %x\n",&a[3]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我在visual studio 2010编译器(VC++)上测试了上面的程序,它给了我运行时错误,说:
变量a周围的堆栈被破坏了
现在我的问题是:堆栈是否已终生损坏,或者仅在上述错误程序执行期间?
同样,我知道两次删除相同的指针可能会造成堆损坏等非常糟糕的事情.以下代码:
int* p=new int();
delete p;
delete p; // oops disaster here, undefined behaviour
Run Code Online (Sandbox Code Playgroud)
当上面的代码片段执行时,VC++在运行时显示堆损坏错误.
根据这个虚函数必须定义,否则链接器抱怨并报告错误"未定义引用vtable",但为什么ideone编译器不会为以下代码提供任何错误?
#include <iostream>
using namespace std;
class Test
{
public:
Test()
{
cout<<"test() is called\n";
}
virtual void test();
};
int main() {
Test t;
// your code goes here
return 0;
}
Run Code Online (Sandbox Code Playgroud) 无法访问的代码是Java等语言中的编译时错误.但为什么它只是在C++和C中发出警告?考虑以下示例:
#include <iostream>
int f()
{
int a=3;
return a;
int b=6; // oops it is unreachable code
std::cout<<b; // program control never goes here
}
int main()
{
std::cout<<f()<<'\n';
}
Run Code Online (Sandbox Code Playgroud)
不应该编译器在这个程序中抛出一个错误,因为函数f()中的return语句之后的语句永远不会被执行?允许无法访问代码的原因是什么?
考虑以下程序:(参见此处的现场演示)
#include <stdio.h>
int main(void)
{
char c[]={'s','h','r','e','y','a','\0'};
char *ptr=c;
for(int i=0;i<6;i++)
printf("%c",ptr[i]);
printf("\n");
char (*s)[7];
s=&c;
for(int i=0;i<6;i++)
printf("%c",(*s)[i]);
printf("\n");
ptr=&c[5]; // ptr points to 6th char of string
for(int i=5;i>=0;i--)
printf("%c",ptr[i]);
}
Run Code Online (Sandbox Code Playgroud)
该计划没有给出预期的结果.我得到的结果是:
SHREYA
SHREYA
一个
但如果我写下最后一个循环如下,它工作正常.
for(int i=5;i>=0;i--)
printf("%c",c[i]);
Run Code Online (Sandbox Code Playgroud)
关于指针我在这里理解错了什么?为什么我printf("%c",ptr[i]);在last for循环中写入时只有最后一个char作为输出.