There are couple problems pointed out by some people
1. str2 and str3 are the same object. saves comparison
2. java use pascal type string (with strlen stored in the string),
so it saves comparison quite a bit.
Also, actual comparison could very well be done by native code.
So, this benchmark is flawed. (It is also obvious that Java version
couldn't possibily be faster than C version if test is done correctly).
As for my experience working with large images in Java. It is slow.
Very slow.
First, in this piece of code, nn is actually a constant. The code is
equivalent to:
unsigned char block[255], ...
Second, as kukutf pointed out, newer compilers can handle this. For example:
void foo(const char * bar) {
int len = strlen(bar);
char buffer[len+1];
// manipulate buffer
}
is perfectly OK with gcc3.4.x and up.
When we enter a function body, the compiler will adjust the stack pointer to
allocate space for local variables. Say we are on an x86 platform, the
corresponding mac
In this example:
void foo(const char * bar) {
int len = strlen(bar);
char buffer[len+1];
int t1,t2,t3...
...
t1=3
}
now the offset of t1,t2,t3... are not fixed. They need runtime calculation.
I believe that this is possible for a compiler.
However, for each reference of variable "t1", the compiler has to emit code
to calculate the address t1 or save the address in somewhere.
Either approach will hurt the performance significantly. And it may also
lead to some safty problems.
一个socket的小程序:
发送方:
int len = strlen(str);
write(sock,&len,sizeof(int));
write(sock,str,len);
接受方:
int len;
read(sock,&len,sizeof(int));
char* str=(char*)malloc(len*sizeof(char));
read(sock,str,len);
According to your reply, I modified the code:
...
#else
char* const* dp_argv = (char**)malloc(strlen(*argv)+1);
strcpy(*dp_argv,*argv);
execvp(cmd, dp_argv);
#endif
It works well. Thanks!
最近看了Effective C++ 2nd的一部分,感觉里面提到的有些东西要在实际coding中完
全做到似乎非常复杂,比如item 11,Declare a copy constructor and an
assignment operator for classes with dynamically allocated memory,我尝试了
下面这段代码:
#include
using namespace std;
class String {
public:
String(const char *value);
~String() {};
char * getString();
private:
char *data;
};
String::String(const char *value)
{
if (value) {
data = new char[strlen(value) + 1];
strcpy(data, value);
这段程序读boa的配置文件boa.conf,找到端口号后改写新端口,例如
Port 80
# Listen: the Internet address to bind(2) to. If you leave it out,
# it takes the behavior before 0.93.17.2, which is to bind to all
# addresses (INADDR_ANY). You only get one "Listen" directive,
变成Port 8080
# Listen: the Internet address to bind(2) to. If you leave it out,
# it takes the behavior before 0.93.17.2, which is to bind to all
# addresses (INADDR_ANY). You only get one "Listen" directive,
现在发现每次第一次修改的时候这一行没问题,但是下面的注释的#号没有了,变成
n: the I... 阅读全帖
I am not sure what you need.
but by my understand ~
#include
#include
#include
#define transfer(x) ({char *tmp=(x); \
int i,sz=strlen(tmp);\
char *ret=(char *)malloc(sizeof(char)*sz*2);\
for(i=0;i
ret[2*i]=tmp[i];\
ret[2*i+1]='\0';\
}\
ret;})
int main(){
char *t;
t=transfer("abc") ;
int i;
for(i... 阅读全帖
I am not sure what you need.
but by my understand ~
#include
#include
#include
#define transfer(x) ({char *tmp=(x); \
int i,sz=strlen(tmp);\
char *ret=(char *)malloc(sizeof(char)*sz*2);\
for(i=0;i
ret[2*i]=tmp[i];\
ret[2*i+1]='\0';\
}\
ret;})
int main(){
char *t;
t=tran... 阅读全帖
Try this.
Fill as many char size as you could reach
//file define.c
//transfer must be put at the end of array if overrun index
// and you dont want to calculate the size.
// precisely use trans(x, n) macro
//if you really assign a large char array, then take my first approach.
#include
#include
//unsafe but ok
#define transfer(x) trans(x, 10)
#define trans(x, n) trans##n(x), #x[n]
#define trans10(x) trans9(x), #x[9]
#define trans9(x) trans8(x), #x[8]
#define trans8(x) tra... 阅读全帖