打赌贴,C/C++是最优秀的语言

丁劲犇 2016-06-30 11:28:48
和人打赌,如何引起坛子掐架,如题! 先来起个头!把这二者合起来说,鉴于两点。首先,目前大部分编译器允许用cpp的工具链嵌入c的代码。其次,二者在二进制层面没什么区别,最终cpp会被转化为C,并生成机器码。 大家说说呗,盖起一百楼有人请我吃海鲜
...全文
680 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
gamedev˚ 2016-07-09
  • 打赏
  • 举报
回复
slmax1 2016-07-09
  • 打赏
  • 举报
回复
周末随便来看看
女神打Boss 2016-07-08
  • 打赏
  • 举报
回复
我一直是c++攻城狮,但我能说我c++ primer 只看了第一章么
spawn888 2016-07-05
  • 打赏
  • 举报
回复
瞎说,梅西才是最好的球员
zbdzjx 2016-07-05
  • 打赏
  • 举报
回复
我们用Delphi的,只在旁边观战。
wjb_yd 2016-07-05
  • 打赏
  • 举报
回复
引用 23 楼 goldenhawking 的回复:
[quote=引用 22 楼 wjb_yd的回复:][quote=引用 楼主 goldenhawking 的回复:] 最终cpp会被转化为C
lz你确定??? 我书读的少,你别骗我。。[/quote] 恩!解释一下。用工具depend walker 查看cpp编译出的库,会发现所谓的类成员函数也都是c的形式,只是加入了与命名空间,类名,参数表相关的后缀,前饰。如果采用该名称,是可以用C直接加载进进程的。成员函数除了列出的参数外,还有一个隐含参数,即this指针。这也是cpp11里,functional bind一个对象的方法时,要先传对象地址的原因。[/quote] 好吧,你只能说c++和c殊途同归。我觉得只有在面对比较追求效率,而且业务逻辑比较抽象的时候,C++才是最好的语言。编译型语言和解释型语言终究没有可比性。
糯米粽子1218 2016-07-05
  • 打赏
  • 举报
回复
luciferisnotsatan 2016-07-05
  • 打赏
  • 举报
回复
干嘛不发去C/C++版,跟赵老湿讨论下
丁劲犇 2016-07-05
  • 打赏
  • 举报
回复
上面代码中,可见, 1、一般类成员函数不占类的size 2、虚函数会占size 所以,二进制上,C++类就是C 的struct + 虚函数指针 而C和C++是可以互操作的, http://blog.csdn.net/goldenhawking/article/details/51824748

#include <iostream>
#include <stdio.h>
using namespace std;
#pragma pack (push, 1)
//we define 2 classes
class A {
private:
    static uint8_t s;
    uint8_t m1 = 3;
protected:
    uint8_t m2 = 4;
public:
    void add () { cout << m1 * m2 * s<<"\n";}
    virtual void fun () {cout << "(-:<\n";}
};
uint8_t A::s = 10;

class B :public A {
public:
    B():A(){}
    uint8_t m3 = 5;
    virtual void fun () {cout << ")-:<\n";}
};
//we define a C struct
struct sblock {
    void ** fun;
    uint8_t m1;
    uint8_t m2;
    uint8_t m3;
};

#pragma pack(pop)


typedef void (*c_fun) (void *);
int main(int /*argc*/, char * /*argv*/[])
{
    //block is a struct
    sblock block;
    void * blockfun = ( void * ) &B::fun;
    block.m1 = 3;
    block.m2 = 4;
    block.m3 = 5;
    block.fun = &blockfun;

    //we force a pointer convert
    A * p = (A *) █
    //call 
    p->add();
    p->fun();

    //we call a C++ function using C function pointer
    A b;
    c_fun cfun = (c_fun) &A::fun;
    cfun (&b);

    return 0;
}

120
)-:<
(-:<
在GNU C++编译器archlinux x64环境测试通过。对GNU C++编译器而言,这种测试尤为简单。对MSVC编译器,就复杂一些。因为windows下,C++ 的成员函数和 C 具有不同的栈操作。
丁劲犇 2016-07-04
  • 打赏
  • 举报
回复

#include <iostream>
#include <string>
using namespace std;
#pragma pack (push, 1)
class A {
	public:
	uint32_t m_a;
	A(int a):m_a(a) {}
};
class B {
	private:
	uint32_t m_b;
	public:
	B():m_b(1) {}
	void print ()
	{
		cout << "B::print :"<< m_b << endl;
	}
};
class C {
	public:
	uint32_t m_c;
	C():m_c(2) {}
	virtual void print ()
	{
		cout << "C::print :"<< m_c << endl;
	}
};
class C1 : public C{
	public:
	uint16_t m_c1;
	C1():C(),m_c1(3) {}
	virtual void print ()
	{
		cout << "C1::print :"<< m_c << "," << m_c1 << endl;
	}
};
class C2 : public C{
	public:
	string m_c2;
	C2():C(),m_c2("four") {}
	virtual void print ()
	{
		cout << "C1::print :"<< m_c << "," << m_c2 << endl;
	}
};
#pragma pack (pop)
int main(int arc, char * argv[])
{
	cout<<"size of class A  is " << sizeof(A) << endl;
	cout<<"size of class B  is " << sizeof(B) << endl;
	cout<<"size of class C  is " << sizeof(C) << endl;
	cout<<"size of class C1 is " << sizeof(C1) << endl;
	cout<<"size of class string is " << sizeof(string) << endl;
	cout<<"size of class C2 is " << sizeof(C2) << endl;
	return 0;
}


size of class A  is 4
size of class B  is 4
size of class C  is 12
size of class C1 is 14
size of class string is 32
size of class C2 is 44

丁劲犇 2016-07-04
  • 打赏
  • 举报
回复
引用 22 楼 wjb_yd的回复:
[quote=引用 楼主 goldenhawking 的回复:] 最终cpp会被转化为C
lz你确定??? 我书读的少,你别骗我。。[/quote] 不过这个说法很大意义上是含糊的,准确的说法是,二者编译出来的二进制代码在结构上高度一致,相同家族的编译器,可以互相调用。即使在C里,只要获得了cpp类对象实例的指针,就可以调用其成员,通过C的呼叫方式。
丁劲犇 2016-07-04
  • 打赏
  • 举报
回复
引用 22 楼 wjb_yd的回复:
[quote=引用 楼主 goldenhawking 的回复:] 最终cpp会被转化为C
lz你确定??? 我书读的少,你别骗我。。[/quote] 恩!解释一下。用工具depend walker 查看cpp编译出的库,会发现所谓的类成员函数也都是c的形式,只是加入了与命名空间,类名,参数表相关的后缀,前饰。如果采用该名称,是可以用C直接加载进进程的。成员函数除了列出的参数外,还有一个隐含参数,即this指针。这也是cpp11里,functional bind一个对象的方法时,要先传对象地址的原因。
wjb_yd 2016-07-04
  • 打赏
  • 举报
回复
引用 楼主 goldenhawking 的回复:
最终cpp会被转化为C
lz你确定??? 我书读的少,你别骗我。。
zsdsywr123 2016-07-03
  • 打赏
  • 举报
回复
笑容融化坚冰 2016-07-02
  • 打赏
  • 举报
回复
一般java,.net,php会战来战去,C/C++这种强大的元老级语言,找茬的不多
丁劲犇 2016-07-02
  • 打赏
  • 举报
回复
目前C/C++不但可以开发桌面消费应用,更是重工基础工具,地位无可替代。 JVM, CLR,胶水语言,也是采用C/C++开发。对工具链的产生而言,或许可以用语言1 写出语言2,再用语言2写出语言3,但一般就到此为止了。 层级越高, 语言所应对的需求就越窄, 其能够胜任的领域就越少。作为一门生产新语言的语言,C/C++还没有遇到真正的挑战者。
丁劲犇 2016-07-02
  • 打赏
  • 举报
回复
我已经请客了,额,看来楼上几位说的对,选错话题了
newerC 2016-07-01
  • 打赏
  • 举报
回复
装个vs很麻烦吗
把分全给哥 2016-07-01
  • 打赏
  • 举报
回复
luciferisnotsatan 2016-07-01
  • 打赏
  • 举报
回复
引用 10 楼 yjz1409276 的回复:
楼主你这是看CSDN太冷清,要引起撕逼大战吗?
作为在C/C++版混迹过几年的人,可以很负责任的告诉你,lz选错话题了。C/C++不会找别的语言掐架,其他语言也不太会找C/C++掐架,Cer与C++er之间会掐掐架
加载更多回复(14)

590

社区成员

发帖
与我相关
我的任务
社区描述
提出问题
其他 技术论坛(原bbs)
社区管理员
  • community_281
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧