Browsed by
标签: C++

Android将允许纯C/C++开发应用

Android将允许纯C/C++开发应用

对于Android,长期以来,我一直有两件事搞不懂,

  • 一个是为什么Android要选用Java。对于嵌入式开发,CPU和内存都很宝贵,居然还使用Java。
  • 一个是为什么Android的开发站点要被墙。这只是一个技术网站啊。

最近,在一个Android开发人员的Blog上证实了在NDK r5使用C/C++进行开发。(以前,Android 对C/C++开发的支持仅限于用C/C++开发动态链接库,然后在Java中以JNI的形式来调用)现在,你可以用纯C/C++开发了(参看下面的程序代码)。还有一段完整的代码示例在这里(墙,还有XML的manifest,又见XML)。看来,Google终于明白为什么使用Android的手机(如:Moto, 三星、索爱和HTC)的触摸体验远远不及object C搞出来的iPhone。

void android_main(struct android_app* state) {
    // Make sure glue isn't stripped.
    app_dummy();

    // loop waiting for stuff to do.
    while (1) {
        // Read all pending events.
        int ident;
        int events;
        struct android_poll_source* source;

        // Read events and draw a frame of animation.
        if ((ident = ALooper_pollAll(0, NULL, &events,
                (void**)&source)) >= 0) {
            // Process this event.
            if (source != NULL) {
                source->process(state, source);
            }
        }
        // draw a frame of animation
        bringTheAwesome();
    }
}

我个人估计有两个原因为什么Google回头支持C/C++了,

  1. Google开始觉得自己整的JVM在性能上可以全面超越传统JVM,并接近C/C++,现在发现搞不定了。
  2. Google发现Java的程序员不像C/C++程序员那样注重程序的性能和效率,开发App太耗CPU和内存。

于是只好转回支持C/C++。本来就是用C/C++写出来的Android嘛,居然不能用C/C++而只能用Java,真是太侮辱C/C++了。最后,只希望Google并不是又整了一个C/C++版的Dalvik虚拟机,不然就真是侮辱到极点了。

——— 更新 2011/01/24 ————

谢谢大家对这篇文章的评论,挺有意思的,欢迎讨论,我把我的回复更新在下面。不一定对,仅供大家参考。

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (37 人打了分,平均分: 4.49 )
Loading...
64位平台C/C++开发注意事项

64位平台C/C++开发注意事项

http://www.viva64.com/en/l/上例出了28个在64位平台上使用C/C++开发的注意事项,对于进入64位时代的程序员应该去看看这28个事项,这些英文读物对于有C/C++功底的朋友读起来应该并不难,我估计大约20-30分钟可以精读完一篇(或者更快),下面是这28个注意事项的列表。相信对大家一点有帮助。

  • Lesson 01. What 64-bit systems are.
  • Lesson 02. Support of 32-bit applications.
  • Lesson 03. Porting code to 64-bit systems. The pros and cons.
  • Lesson 04. Creating the 64-bit configuration.
  • Lesson 05. Building a 64-bit application.
  • Lesson 06. Errors in 64-bit code.
  • Lesson 07. The issues of detecting 64-bit errors.
  • Lesson 08. Static analysis for detecting 64-bit errors.
  • Lesson 09. Pattern 01. Magic numbers.
  • Lesson 10. Pattern 02. Functions with variable number of arguments.
  • Lesson 11. Pattern 03. Shift operations.
  • Lesson 12. Pattern 04. Virtual functions.
  • Lesson 13. Pattern 05. Address arithmetic.
  • Lesson 14. Pattern 06. Changing an array’s type.
  • Lesson 15. Pattern 07. Pointer packing.
  • Lesson 16. Pattern 08. Memsize-types in unions.
  • Lesson 17. Pattern 09. Mixed arithmetic.
  • Lesson 18. Pattern 10. Storage of integer values in double.
  • Lesson 19. Pattern 11. Serialization and data interchange.
  • Lesson 20. Pattern 12. Exceptions.
  • Lesson 21. Pattern 13. Data alignment.
  • Lesson 22. Pattern 14. Overloaded functions.
  • Lesson 23. Pattern 15. Growth of structures’ sizes.
  • Lesson 24. Phantom errors.
  • Lesson 25. Working with patterns of 64-bit errors in practice.
  • Lesson 26. Optimization of 64-bit programs.
  • Lesson 27. Peculiarities of creating installers for a 64-bit environment.
  • Lesson 28. Estimating the cost of 64-bit migration of C/C++ applications.
好烂啊有点差凑合看看还不错很精彩 (12 人打了分,平均分: 4.00 )
Loading...
输出从1到1000的数

输出从1到1000的数

有这样一个面试题——请把从1到1000的数打印出来,但你不能使用任何的循环语句或是条件语句。更不能写1000个printf或是cout用C/C++语言

我相信,大多数人一开始你可能想到的是递归算法:

void f(int n){
    printf("%d\n",n);
    (1000-n) ? f(n+1) : exit(0) ;
}
int main(){
    f(1);
}

当然,题目中说了不能使用条件语句,所以,上面那种解法的不符合题意的,因为还是变向地使用了条件表达式。不过,我们可以用别的方法来让这个递归终止,比如:

除以零,当程序crash,呵呵。

void f(int n){
    printf("%d\n",n);
    n/(1000-n);
    f(n+1);
}

还有这样退出递归的:

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (19 人打了分,平均分: 3.89 )
Loading...
C++的字符串格式化库

C++的字符串格式化库

这里向大家介绍一个C++的字符串格式化库,叫cpptempl,这个库支持对字符串格式的条件,循环,变量插入。看上去很不错,只不过其是基于boost库的。

下面是一个例子:

// The text template
wstring text = L"I heart {$place}!" ;
// Data to feed the template engine
cpptempl::data_map data ;
// {$place} => Okinawa
data[L"place"] = cpptempl::make_data(L"Okinawa");
// parse the template with the supplied data dictionary
wstring result = cpptempl::parse(text, data) ;

输出结果是:

I heart Okinawa!

是不是很方便?让我们看一个更复杂的例子:

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (10 人打了分,平均分: 3.70 )
Loading...
一些非常不错的资料

一些非常不错的资料

一、Intel 给开发人员推荐的资料列表(2010年下半年)

Intel Recommended Books for Developers

其中包含了

  • 硬件:硬件,电源,存储,无线
  • 软件:多线程和多核技术,高性能计算,图形游戏,用户关注
  • 嵌入式:设计,软件,操作系统,安全,优化。
  • IT部门:策略和决策,服务器和数据中心,客户端

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (15 人打了分,平均分: 3.60 )
Loading...
面向对象是个骗局?!

面向对象是个骗局?!

今天在网上看到网页叫“Object Orientation Isa Hoax”——面向对象是一个骗局,标题很有煽动性(注:该网站上还有一个网页叫Object Orientation Is Dead),好吧,打开看看上面有些 什么,发现这个网页是在收集一些关于“面向对象的反动言论”,没想到的是,很多言论出自很多大师之口。比如:Alexander Stepanov和Bjarne Stroustrup。这些言论挺有意思的,所以,我摘两段在下面:

第一段是Alexander Stepanov的(不要告诉我你不知道这个人,STL之父,关于他的故事,可以到这里看看)。他N年前作过一段采访,原文在这里(我非常建议大家去读一下这篇采访,相当过瘾),译文在这里(不过有地方把原意都译反了,我重译了一下),其中有一个问答被上述的那个面向对象反动言论的网页收录了:

Alexander Stepanov

Question:
I think STL and Generic Programming mark a definite departure from the common C++ programming style, which I find is almost completely derived from SmallTalk. Do you agree?

提问
我认为STL和泛型编程标志着非同一般的C++编程风格,而一般C++风格几乎完全是从SmallTalk派生过来的。你同意吗?

Answer:
Yes. STL is not object oriented. I think that object orientedness is almost as much of a hoax as Artificial Intelligence. I have yet to see an interesting piece of code that comes from these OO people. In a sense, I am unfair to AI: I learned a lot of stuff from the MIT AI Lab crowd, they have done some really fundamental work: Bill Gosper’s Hakmem is one of the best things for a programmer to read. AI might not have had a serious foundation, but it produced Gosper and Stallman (Emacs), Moses (Macsyma) and Sussman (Scheme, together with Guy Steele). I find OOP technically unsound. It attempts to decompose the world in terms of interfaces that vary on a single type. To deal with the real problems you need multisorted algebras families of interfaces that span multiple types. I find OOP philosophically unsound. It claims that everything is an object. Even if it is true it is not very interesting saying that everything is an object is saying nothing at all. I find OOP methodologically wrong. It starts with classes. It is as if mathematicians would start with axioms. You do not start with axioms you start with proofs. Only when you have found a bunch of related proofs, can you come up with axioms. You end with axioms. The same thing is true in programming: you have to start with interesting algorithms. Only when you understand them well, can you come up with an interface that will let them work.

回答:
是的。STL不是面向对象的。我认为面向对象和人工智能差不多,都是个骗局。我至今仍然没有从那些OO编程的人那里看到一丁点有意思的代码。从某种意义上来说,我这么说对人工智能(AI)并不公平:因为我听说过很多MIT(麻省理工大) AI实验室里一帮人搞出来的东西,而且他们的确直正干了一些基础性的工作:Bill Gosper的Hakmem是程序员最好的读物之一。AI或许没有一个实实在在的基础,但它造就了Gosper和Stallman(Emacs), Moses(Macsyma)和Sussman(Scheme, 和Guy Steele一起)。

  • 我发现OOP在技术上是荒谬的,它企图把事物按照不同单个类型的接口来解构,为了处理实际问题,你需要多种代数方法——横跨多种类型的接口族;
  • 我发现OOP在哲学上是荒谬的,它声称一切都是对象。即使这是真的也不是很有趣——因为说一切都是对象跟什么都没说一样;
  • 我发现OOP的方法论是错误的,它从类开始,就好像数学应该从从公理开始一样。其实你不会是从公理开始的,而是从证明开始。直到你找到了一大堆相关证据后你才能归纳出公理,然后以公理结束。在程序设计方面存在着同样的事实:你要从有趣的算法开始。只有很好地理解了算法,你才有可能提炼出接口以让其工作。

<———>

下面,我们再来看C++的发明者Bjarne Stroustrup,在1998年IEEE采访时的一段话(全篇见这里),下面是其中的几段话:(我的翻译如下)

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (37 人打了分,平均分: 4.14 )
Loading...
Windows编程革命简史

Windows编程革命简史

源文:A Brief History of Windows Programming Revolutions (Ron Burk)

首先,是 Windows API 和 DLL Hell。(译注:DLL Hell——DLL灾难,就是微软的DLL升级时因为不同版本可能造成应用程序无法运行的灾难,首当其冲的是COM编程,相信大家都知道某些木马或是病毒更改了一些系统的DLL可以导致整个Windows不举,这就是DLL Hell) 于是,第一次革命是DDE——我们可以创建一个状态条在上面显示Microsoft的股票价格(译注:Dynamic Data Exchange,工作原理是: 甲方申请一块全局内存,然后把内存指针postmessage到乙方,乙方根据收到的指针访问那块全局内存)。

在那个时候,Microsoft 创建了 VERSIONINFO 资源来管理版本信息,当然,是用来消除DLL Hell。但是,另一个微软内部的小组发现了DDE的致命缺陷:这不是他们做的!

为了解决这个问题,他们创造了OLE(很像DDE,只是名字不一样),而且,我还记得在一次 Microsoft 大会上,某个微软的演讲者正式宣布—— Windows API 马上就会被 OLE API 所重写并取代,我还盲目地相信了这一说法。而且,所有的在图形界面的控件都会是OCX,那是OLE引入的接口,同样,其目的是为了消除DLL Hell。相信大家都记得,那个时候,我们是怎么地梦想着有一天,我们的应用程序(当然是非常大的程序)可以完全地被嵌入到Word文档中。

然而,在Microsoft的某处,Microsoft有些人开始信仰 C++,其确信MFC的出现并可以解决所有的一切问题,但是,因为历史原因,OLE并没有出局,其改了一个名字,叫COM,此时,我们立马意识到OLE(以前的DDE?)真正意味着什么——其用精心的版本管理系统来消除DLL Hell。与此同时,Microsoft的一个变节小组发现了一个MFC的致命缺陷:这不是他们做的!

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (52 人打了分,平均分: 4.25 )
Loading...
C技巧:结构体参数转成不定参数

C技巧:结构体参数转成不定参数

下面这段程序是一个C语言的小技巧,其展示了如何把一个参数为结构体的函数转成一个可变参数的函数,其中用到了宏和内建宏“__VA_ARGS__”,下面这段程序可以在GCC下正常编译通过:

#include <stdio.h>

#define func(...) myfunc((struct mystru){__VA_ARGS__})

struct mystru { const char *name; int number; };

void myfunc(struct mystru ms )
{
  printf("%s: %d\n", ms.name ?: "untitled", ms.number);
}

int main(int argc, char **argv)
{
  func("three", 3);
  func("hello");
  func(.name = "zero");
  func(.number = argc, .name = "argc",);
  func(.number = 42);
  return 0;
}

从上面这段程序,我们可以看到一个叫 myfunc的函数,被func的宏改变了,本来myfunc需要的是一个叫mystru的结构,然而通过宏,我们把struct mystru的这个参数,变成了不定参数列表的一个函数。上面这段程序输出入下,

阅读全文 Read More

好烂啊有点差凑合看看还不错很精彩 (11 人打了分,平均分: 2.82 )
Loading...