小编Des*_*tor的帖子

C++与D中的sizeof运算符和对齐

考虑以下计划:

#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编译器.

c++ d sizeof memory-alignment

4
推荐指数
1
解决办法
151
查看次数

构造函数在g ++和clang ++中委托给自己

考虑以下程序.我不小心弄错了.

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

4
推荐指数
1
解决办法
450
查看次数

不明确的成员模板查找

这个问题的答案在以下代码中说明:

#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::vectorfoo::vector.要解决这个问题,你必须写

f.foo::vector<int>();
Run Code Online (Sandbox Code Playgroud)

我已经试过所有流行的C++编译器(这个程序g++,clang++,vc++和英特尔C++)和所有的编译器编译这个程序没有任何错误.那么,为什么他说这个程序有歧义呢?C++标准对此有何看法?

c++ function-call language-lawyer name-lookup

4
推荐指数
1
解决办法
160
查看次数

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

c++ oop object member-functions

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

什么是C&C++中的原始内存?

很抱歉提出这个问题,但实际上我不知道这个问题.我在下面的FAQ条目中读过: 我可以使用new分配free()指针吗?我可以删除用malloc()分配的指针吗?

此外,无法保证new和delete用于获取和释放原始内存的机制与malloc()和兼容free().

我只是想知道这是什么"原始记忆"?

c++ memory

3
推荐指数
2
解决办法
2268
查看次数

为什么执行无效指针初始化的程序在C中编译得很好?

我编写了一个简单的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 pointers variable-initialization

3
推荐指数
2
解决办法
368
查看次数

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++在运行时显示堆损坏错误.

c++ heap-corruption stack-corruption

3
推荐指数
2
解决办法
1687
查看次数

是现代g ++编译器解决的vtable错误的未定义引用?

根据这个虚函数必须定义,否则链接器抱怨并报告错误"未定义引用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)

c++ gcc virtual-functions g++

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

为什么无法访问的代码不是C++中的错误?

无法访问的代码是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语句之后的语句永远不会被执行?允许无法访问代码的原因是什么?

c c++ unreachable-code

3
推荐指数
2
解决办法
4815
查看次数

关于C中指针递减的困惑

考虑以下程序:(参见此处的现场演示)

#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作为输出.

c pointers pointer-arithmetic

3
推荐指数
2
解决办法
1588
查看次数