K*****n 发帖数: 65 | 1 when a member function is called, "this" pointer is implicitly passed as
argument.It is part of function signature. Therefore
void func() const;//say "*this" will not be changed.
void func(); //"*this" may or may not be changed.
void main()
{
test a;
a.func(); //call void func();
((const A)a).func(); //call void func() const;
(*(const A *)&a).func(); //call void func() const;
} |
|
s**i 发帖数: 381 | 2 Suppose I have the following class:
class test{
public:
void func() const
{
cout<<"hello,func const"<
}
void func()
{
cout<<"hello,func"<
}
};
when A is an object of test.
What will A.func() give me?
My test says always the "hello,func" but I don't know why.
Thanks |
|
j***i 发帖数: 1278 | 3 #include
class C
{
friend void func(){std::cout<<"friend func";}
};
//void func();
int main()
{
func();
}
注释掉后 func': candidate function(s) not accessible error,
加上就好了, 定义在non-local class 里的 friend class 应该和class 一个namespa
ce呀,不声明一下就出错了? |
|
|
l**********6 发帖数: 10 | 5 楼主 不太看得懂你发的,能不能详细解释一下
“比如一个funcobj2.value = () => obj1.Value+1” 中的 funcobj2 是什么?
“在执行这个func时候,也就是get obj1的Value的时候obj1.Value
obj2 subscribe obj1” 中 obj1.Value obj2 subscribe obj1 是什么意思? |
|
|
j****i 发帖数: 305 | 7 I had a sense that one could use func ptr, but there's no way that I could
come up with your solution!
Thanks. |
|
s********z 发帖数: 5411 | 8 我有一个从CCD camera采集图像的小程序,以前是用MSVC,没什么问题,现
在为了把界面变得漂亮点改成Qt+mingw的。
在用library的时候出现了undefined reference to "func" 的错误,
用的是national instrument的library, niimaq.h.
不知道该怎么办,大家请帮帮忙。
多谢 |
|
c********e 发帖数: 78 | 9 系里的电脑,不想重装,每次开机都出来框框说“func.exe"病毒,请教大侠用什么程
序可以删除它呢?多谢。 |
|
|
C**R 发帖数: 1047 | 11 Adv. Func. Mat. 可是共同第一作者吗? |
|
s******g 发帖数: 5074 | 12 【 以下文字转载自 board 讨论区 】
发信人: serawang (皇叔郎-玉女伏魔棍), 信区: board
标 题: 新基版是否需要个id准入的func
发信站: BBS 未名空间站 (Sun Aug 23 20:18:38 2009, 美东)
省得每天毫无任何理由得封id, 给0区找麻烦哪!!! |
|
f*********m 发帖数: 726 | 13 我知道如果函数func不是recursive的话,func(type arg)和func(type & arg)的区别
,比如func(int i)和func(int& i)。但func是recursive的话,用不用reference有什
么区别?
比如:
void func(type arg){
...
func(arg+1);
...
}
与
void func(type& arg){
...
func(arg+1);
...
}的区别?
recursive会创建很多stack overhead,这是不是说func(type arg)会创建很多arg的
local copy在stack里边,而func(type& arg)只会有一个arg itself?
谢谢。 |
|
t******n 发帖数: 2939 | 14 ☆─────────────────────────────────────☆
l63 (l63) 于 (Thu May 23 00:34:22 2013, 美东) 提到:
假设素数只有有限个, 记为 p_1,p_2,...,p_k
考察 N = p_1*p_2*...*p_k + 1
可知: 对于任意i = 1,2,3,...,k, p_i 不能整除 N
由素数的定义:
a是素数 <=> a是大于1的自然数, 且a不被任何小于a的素数整除
可知: N是素数
这与素数只有p_1,p_2,...,p_k矛盾.
故假设不成立.
所以素数有无穷多个.
☆─────────────────────────────────────☆
l63 (l63) 于 (Thu May 23 00:37:03 2013, 美东) 提到:
在承认素数的这个等价定义 (即 a是素数 <=> a是大于1的自然数, 且a不被任何小于a
的素数整除) 的前提下, 居然有人会认为这个证明是错的, 或者是不完备的.
我实在不能理解.
求问一下大家, 是不是有的人的脑子天生有缺陷, 根本怎么教都不会明白... 阅读全帖 |
|
d**********o 发帖数: 1321 | 15 hw3 & hw3b 最终结果
贴一个自己 hw3b 的 match 结果让小伙伴们感受一下我们作业需要的结果是什么样子
的。
如果是同专业的小伙伴,最后拷贝到编辑器中仔细看一下,这个网页因为宽度有限,让
并排两列的比较呈现出来的很变形。
=================================================
Output of Building User Code
Explode the tar
c-.l
c-.y
makefile
scanType.h
symtab.h
symtab.c
20131116163236-(me~~)-CS445-F13-A3B.tar: POSIX tar archive (GNU)
Tests: directory
c-.l: lex description text
c-.y: lex description text
... 阅读全帖 |
|
d**********o 发帖数: 1321 | 16 hw3b deadline前版本
这里我也先公开承认一下自己早前犯过的错误,在这个楼的第 14 页、第 265 楼,我
有贴出自己的hw3b,但现在我必须向亲爱的读者一一您公开道歉。因为当时因为着急,
我没能找到hw3b deadline前的版本,就把这次作业后来的最终版本(也就是那个楼贴
出来的,只剩下ReturnK、CompoundK两条小尾巴的版本,那个版本被我改动了时间戳我
现在已经把它改回来了。相比于急于求成绩,我更希望自己作一个诚实的人,希望大家
能原谅)给贴出来了。因为我们作业deadline之后也还都是可以接着交的,所以任何作
业,老师都是可以根据后来的版本,追终到这个学生的最后进展的,这个最新进展老师
到底给不给分、就要看老师如何下决定了。
deadline前的版本,被我附在下面了。
当然,把自己的这个版本更新后,我愿为这个楼(这一次出来写的所有)属于自己的每
个贴子负责,所有写出来的,都是真实发生过的事。
=================================================
Output of Building User Code
Ex... 阅读全帖 |
|
d**********o 发帖数: 1321 | 17 hw3 & hw3b 最终结果
贴一个自己 hw3b 的 match 结果让小伙伴们感受一下我们作业需要的结果是什么样子
的。
如果是同专业的小伙伴,最后拷贝到编辑器中仔细看一下,这个网页因为宽度有限,让
并排两列的比较呈现出来的很变形。
=================================================
Output of Building User Code
Explode the tar
c-.l
c-.y
makefile
scanType.h
symtab.h
symtab.c
20131123233236-(me~~)-CS445-F13-A3B.tar: POSIX tar archive (GNU)
Tests: directory
c-.l: lex description text
c-.y: lex description text
... 阅读全帖 |
|
d**********o 发帖数: 1321 | 18 hw3b deadline前版本
这里我也先公开承认一下自己早前犯过的错误,在这个楼的第 14 页、第 265 楼,我
有贴出自己的hw3b,但现在我必须向亲爱的读者一一您公开道歉。因为当时因为着急,
我没能找到hw3b deadline前的版本,就把这次作业后来的最终版本(也就是那个楼贴
出来的,只剩下ReturnK、CompoundK两条小尾巴的版本,那个版本被我改动了时间戳我
现在已经把它改回来了。相比于急于求成绩,我更希望自己作一个诚实的人,希望大家
能原谅)给贴出来了。因为我们作业deadline之后也还都是可以接着交的,所以任何作
业,老师都是可以根据后来的版本,追终到这个学生的最后进展的,这个最新进展老师
到底给不给分、就要看老师如何下决定了。
deadline前的版本,被我附在下面了。
当然,把自己的这个版本更新后,我愿为这个楼(这一次出来写的所有)属于自己的每
个贴子负责,所有写出来的,都是真实发生过的事。
=================================================
Output of Building User Code
Ex... 阅读全帖 |
|
z****e 发帖数: 54598 | 19 所谓大项目,就是你一个搞不定全部的项目
或者你一个人在短时间内无法搞定所有的项目
而且往往是需要一堆人来搞的项目,统称大项目
这种项目一般都需要跟特别大的集团打交道
什么是特别大的集团?你到城里去
抬头看,看那些大厦上面的logo都是哪些公司
基本上就是这些公司了
常见的有银行,航空公司,政府,保险公司这些
这些集团基本上都养猴子
所以大项目基本上都是这些集团一个或者多个凑一起
搞出来的项目
那跟这些集团打交道,绝对不是什么一两条枪就能搞定的
多数时候需要合作,跟其他人合作
这就是大项目
那既然是合作,必然有人写代码,有人看代码
那看代码的时候最喜欢的语言,肯定是java
为啥?举个例子,你有一个InputField
java是这么定义的
InputField intfd = new ...;
而且ide可以帮忙,就是任何时候,你看到一个名词
比如这里的intfd,你看不懂,按住cmd然后点这个名词
你就可以跳到这个的声明部分,你看到声明就知道是什么了
然后如果你对这个东西的动作有兴趣
比如disableInput(),在intfd后面加一个点.
ide就会自动跳出所有跟这个intfd... 阅读全帖 |
|
z****e 发帖数: 54598 | 20 所谓大项目,就是你一个搞不定全部的项目
或者你一个人在短时间内无法搞定所有的项目
而且往往是需要一堆人来搞的项目,统称大项目
这种项目一般都需要跟特别大的集团打交道
什么是特别大的集团?你到城里去
抬头看,看那些大厦上面的logo都是哪些公司
基本上就是这些公司了
常见的有银行,航空公司,政府,保险公司这些
这些集团基本上都养猴子
所以大项目基本上都是这些集团一个或者多个凑一起
搞出来的项目
那跟这些集团打交道,绝对不是什么一两条枪就能搞定的
多数时候需要合作,跟其他人合作
这就是大项目
那既然是合作,必然有人写代码,有人看代码
那看代码的时候最喜欢的语言,肯定是java
为啥?举个例子,你有一个InputField
java是这么定义的
InputField intfd = new ...;
而且ide可以帮忙,就是任何时候,你看到一个名词
比如这里的intfd,你看不懂,按住cmd然后点这个名词
你就可以跳到这个的声明部分,你看到声明就知道是什么了
然后如果你对这个东西的动作有兴趣
比如disableInput(),在intfd后面加一个点.
ide就会自动跳出所有跟这个intfd... 阅读全帖 |
|
l*******m 发帖数: 1096 | 21 I think your distance function was defined in a wrong way. Here is an
example
def test_pyfunc_metric():
def dist_func(x1, x2, p):
return np.sum((x1 - x2) ** p) ** (1. / p)
X = np.random.random((10, 3))
euclidean = DistanceMetric.get_metric("euclidean")
pyfunc = DistanceMetric.get_metric("pyfunc", func=dist_func, p=2)
D1 = euclidean.pairwise(X)
D2 = pyfunc.pairwise(X)
assert_array_almost_equal(D1, D2)
I didn't know it before, just checked source codes for you.
... 阅读全帖 |
|
d****n 发帖数: 1637 | 22 献给gopher们,俺还没踩到,不过惊出一身冷汗。希望对其他gopher有用
http://studygolang.com/articles/5188
坑(s)
每种编程语言都有自己的专属坑(s),Go虽出身名门,但毕竟年轻,坑也不少,在error
处理这块也可以列出几个。
1、 Go FAQ:Why is my nil error value not equal to nil?
type MyError string
func (e *MyError) Error() string {
return string(*e)
}
var ErrBad = MyError("ErrBad")
func bad() bool {
return false
}
func returnsError() error {
var p *MyError = nil
if bad() {
p = &ErrBad
}
return p // Will always return a non-nil error.
}
func main() {... 阅读全帖 |
|
s******n 发帖数: 3946 | 23 When compiler handles b->func(para1, para2), it assumes the address is like
this
vptr_BClass
B data member 1
B data member 2
The call will be translated like this:
((vptr_BClass*)b)[0] -> func (b, para1, para2)
class C extends B & A, then memory layout is like this:
vptr_AClass
A data member 1
A data member 2
vptr_BClass
B data member 1
B data member 2
When we do B* b= &c, compiler will add offset to skip the A part. So a
later call b->func() can be handled in the same way for all subclass... 阅读全帖 |
|
c***d 发帖数: 996 | 24 ☆─────────────────────────────────────☆
geome (Derivative) 于 (Sat Jun 16 16:21:11 2007) 提到:
#include
using namespace std;
class A{
public:
A(){}
A(A& a){cout<<"copying"<
};
A func(A a){
return a;
}
int main(){
A a;
A b=func(a);
return 1;
}
不能编译.
但是如果把 A b=func(a);换成func(a);就可以了.
或者把 A(A& a)换成A(const A& a)也可以编译通过.
按照第二个办法来看,compiler怕A b=func(a)改变了func里面的临时变量,但是func(a)
也会产生同样
的问题啊???不明白...
☆─────────────────────────────────────☆
std (解不了名缰系嗔贪) 于 (Sat Jun 16 17:42:48 2007) |
|
H***a 发帖数: 735 | 25 lz这个问题让我想起以前自己在C++里写得与此类似的错误code, 大体如下:
class A;
void func( A *a )
{
a = new A;
}
int main()
{
A *a = NULL;
func( a );
//print a - error!
}
错误正如M7说的那样. 改成return A* 或者 pass in A** 都可以 (注意A** 是表示你
要修改 A*所以传入 A*的pointer, i.e. A**, 而不是"二维数组").
但更严重的问题是memory leak (malloc 没有 free, new 没有 delete)!! 但是在哪里
free/delete呢? 显然不应该在 func里,不然不是白干活了? 在main里面? 作为func的
用户鬼才知道需要free/delete呢, 就算要清楚,也要知道内存大小吧, 这些都被封装在
func里了.
所以,从software engineering的角度,这种做法是应该避免的. 如OverCloud所言,在
func外面malloc再传进func... 阅读全帖 |
|
z****e 发帖数: 54598 | 26 fp为了保证func的复用,尽量抹杀object的存在
因为class/object这种东西是特殊的数据结构
会导致func跟这种特殊的结构绑定
就很难复用,比如go(USACity la)和go(ChineseCity gz)
是不一样的,因为参数的结构不一样,这就限制了其复用
所以最后fp为了能够重用,写的func参数都是map, list,sring,int这些
而map&list注定对于一个object描述的力度是有限的
限制少木有错,但是就容易包含有各种错误等等
所以为了让func独立出去,稳定其1st class的地位
注定要削弱class/object的存在感
而oop则反过来,提倡并鼓励使用class/object
像java这种,则强迫func寄托在object下面
虽然你也可以定义全局的Util,但是毕竟static方法是很少滴
object才是1st class的地位,这样做的好处就是
不依赖func,而依赖每个object自身
每个class自己有啥问题,自己搞定,当然会有各种搞不定
搞不定没关系,异常catch住,然后收拾掉就好
不要影响其他object就行,... 阅读全帖 |
|
s******n 发帖数: 226 | 27 假设x = 1, Y=1
输出 202.
import java.util.*;
class Short{
public static int[][] path;
public static boolean [][]visit;
public static int ii;
public static int jj;
public static int[][]w = { {100, 1, 1, 1, 1, 100},
{100, 1, 100, 100, 100, 1},
{1, 100, 100, 1, 100, 100},
{1, 100, 100, 100, 1, 100},
{1, 1, 1, 1, 100, 100}
};
static int m =5;
static int n =6;
static int ... 阅读全帖 |
|
s******n 发帖数: 226 | 28 假设x = 1, Y=1
输出 202.
import java.util.*;
class Short{
public static int[][] path;
public static boolean [][]visit;
public static int ii;
public static int jj;
public static int[][]w = { {100, 1, 1, 1, 1, 100},
{100, 1, 100, 100, 100, 1},
{1, 100, 100, 1, 100, 100},
{1, 100, 100, 100, 1, 100},
{1, 1, 1, 1, 100, 100}
};
static int m =5;
static int n =6;
static int ... 阅读全帖 |
|
S**I 发帖数: 15689 | 29 ☆─────────────────────────────────────☆
peking2 (myfacebook) 于 (Tue Jan 17 13:45:24 2012, 美东) 提到:
稍微扩展了一下。
Boggle game。从一个字符开始找邻居字符然后继续找,形成一个word。条件是,形成
了word之后要继续找,因为可能有更长的word。一旦用了一个字符以后,就不可以重复
使用了。
返回可以找到最多word情况的所有word。
更新一下:可以同时从不同的位置开始找,不一定只从一个字符开始。
☆─────────────────────────────────────☆
autumnworm (虫子,秋天的) 于 (Tue Jan 17 13:46:32 2012, 美东) 提到:
看起来好像是基本的背包问题吧。
☆─────────────────────────────────────☆
mark (花生,微爷远爷的爸爸) 于 (Tue Jan 17 14:08:07 2012, 美东) 提到:
☆───────────────────... 阅读全帖 |
|
l*****a 发帖数: 14598 | 30 他的算法对吗?
举个例子
A
\
\
B
find the 2nd largest
you will call func(A,2)
that is func(B,2); n=1; func(null,1)
func(B,2) is func(null,2), n=1; func(null,1)
where can you get the result A?
我什么地方搞错了吗? |
|
j*******e 发帖数: 674 | 31 请看下面code
1 #!/bin/bash
2
3 IFS=:
4 func()
5 {
6 echo $#
7 }
8
9
10 func a:b:c
11 func "a:b:c"
12 string="a:b:c"
13 func $string
14 func "$string"
15
16 IFS=" "
17 func a b c
输出结果:
1
1
3
1
3
问题是:
为什么输出结果的第1行是“1”而不是“3”?而最后一行输出是"3"?
xiexie |
|
|
O******e 发帖数: 734 | 33 There are some differences.
Since functions can be invoked in-line, functions with side-effects are not
allowed to be used in certain ways. Metcalf and Reid give two examples on
page 83 in Fortran 90/95 Explained, which are basically:
! func(z) might not be evaluated if x > y, so if func(z) normally modifies z,
! the value of z is undefined after execution of the following statement
x > y .or. func(z)
! since the order in which func(x,y) and func(y,x) are evaluated must not
! matter, func() m |
|
l********n 发帖数: 54 | 34 父类的函数(pure virtual)抛出一个异常,子类继承。有如下代码
class Foo
{
public:
void virtual func() throw (int, float) = 0;
};
class Bar : public Foo
{
public:
void virtual func() throw(short); // line 1: compile error "
// looser throw specifier"
void virtual func() throw(); // line 2: can compile
void virtual func() throw(float, int); // line 3: can compile
void virtual func() throw(float |
|
s******n 发帖数: 226 | 35 Func(int i, int j, boolean[][] visit){
If( path[i][j]!= -1) return path[a,b];
If( i>m || j>n || i<0 || j<0){
return Integer.MAX_VALUE;
}
If(i==m-1 && j == n-1)
return w[i][j];
visit[i][j] =true;
int up,down,left,right = Integer.MAX_VALUE;
if(!visit[i-1][j])
up = func(i-1,j,visit);
if(!visit[i+1][j])
down = func(i+1,j,visit);
if(!visit[i][j-1])
left = func(i,j-1,visit);
if(!visit[i-1][j])
right = func(i-1,j,visit);
visit[i][j]=false;
path[i][j] = min(up,down,left,right)+w(a);
return path[... 阅读全帖 |
|
s******n 发帖数: 226 | 36 Func(int i, int j, boolean[][] visit){
If( path[i][j]!= -1) return path[a,b];
If( i>m || j>n || i<0 || j<0){
return Integer.MAX_VALUE;
}
If(i==m-1 && j == n-1)
return w[i][j];
visit[i][j] =true;
int up,down,left,right = Integer.MAX_VALUE;
if(!visit[i-1][j])
up = func(i-1,j,visit);
if(!visit[i+1][j])
down = func(i+1,j,visit);
if(!visit[i][j-1])
left = func(i,j-1,visit);
if(!visit[i-1][j])
right = func(i-1,j,visit);
visit[i][j]=false;
path[i][j] = min(up,down,left,right)+w(a);
return path[... 阅读全帖 |
|
a****s 发帖数: 559 | 37 一般传指针和长度两个参数。
void func(int a[], size_t len)
调用时,数组参数decay成int*指针。
如果要在函数里保留参数的数组特性,
可以传array by reference
void func( int (& a)[10] )
或者传array by pointer
void func( int (* a)[10] )
限制是:数组size需要明确定义。
如果要从函数返回数组,同样
可以return by reference
int (& func())[10]
也可以return by pointer
int (* func())[10]
同样限制,需要明确定义数组size。 |
|
t*******r 发帖数: 22634 | 38 让俺改写成 if & only if 的。。。
::=
(func()
operator
func()
&& (func()
operator
(func(
func())
operator
阅读全帖 |
|
f****y 发帖数: 70 | 39 我用javacc做一个简单语法分析
token定义如下
TOKEN :
{
|
|
|
< FUNC: ["a"-"z"] ( ["a"-"z","A"-"Z","_","0"-"9"] )* >
|
|
< ID: ( ["a"-"z","A"-"Z","_","0"-"9"] )+ >
}
FUNC指函数名,ID指任意字符窜,就是说这样的情况是合法的FUNC(ID)
。
不过这样的问题是ID的定义包含FUNC,就是在解析的时候,比如遇到test,就不知道是
FUNC还是ID。
这里规定如果函数如果没有参数就省去括号,比如done和test(d)都可以是函数。
所以不知道如何定义,函数名和ID可以解析的时候可以区别。 |
|
m********5 发帖数: 17667 | 40 因为import, dot操作等消耗的时间远超过其他步骤
所以我觉得有必要修改一下,直接把reptfda用在测试func中
import re
rept=re.compile('\d{4}')
reptfda=rept.findall
为了 eliminate global var lookup overhead 的影响,应该多尝试几次 number=1应
该是不行的。
修改了一下:
def testAthome2(s,niter):
import re
rept=re.compile('\d{4}')
reptfda=rept.findall
def mtimeit(func):
def wrap(*args, **kwargs):
t = timeit.Timer(func)
print func.func_name,
print min(t.repeat(number=niter))
return func
return ... 阅读全帖 |
|
z*******3 发帖数: 13709 | 41
spring的大多数策略应该是所有多线程都需要的吧?
其他语言尤其是脚本,做不到di和ioc很重要一点是当插入的时候
需要有一个宿主,which绝大多数时候是对象
@Inject
MyObject myObject
你得先得到这个myObject才能调用方法
其他脚本经常会搞1st class citizen func
这个没有宿主啊,所以就不存在有inject的问题
你要用func,反正作用域是global的,直接用就是了
就类似static method,但是jvm的static区内存应该尽量省着用
一下子把所有func全部塞入这块中去,好像也不是非常合理
尤其是很多不用的funcs,spring就帮你搞这块的东东了
用的时候,spring会init这个func所属的beans,然后存起来
不用的时候释放,等等,这块属于spring framework高级技能了
有兴趣可以展开,这就是轮子怎么造的问题了
ejb提供了更多的选择,比如ejb di就提供了类似spring的功能
等等 |
|
z*******3 发帖数: 13709 | 42 组件pool最大的好处就在于复用这部分代码
spring通过给不同thread提供可以被分享的func来减少内存的使用
这部分说起来挺麻烦,跟fp的immutable有点类似
简单说就是spring也主张要无副作用的func
不要在func外寄存状态,只有ejb和vert.x可以在func外寄存状态
vert.x也只有worker和普通的verticle可以寄存
新增加的multiple thread shared verticle就跟spring很像了
都不允许寄存状态,如果不寄存状态的话,每个func所属的object
只需要实例化一次就可以了,ejb就会实例化一堆,然后pool起来
spring对于一般的bean只实例化一个,并不断复用这一个
spring也提供那种可以寄存状态的,需要设置bean为prototype
这样每次调用都会重新生成一个object,只是不推荐你这么搞 |
|
z****e 发帖数: 54598 | 43 还在硬拗
说说record和class吧
这两个其实fp和oop都不用
虽然看上去很像
先说fp
fp的理念是information,不是对象,也谈不上class,没有变量
写过clj应该知道,clj不提倡你用什么record
因为这个东西长得像class,你应该尽量把information放入map
这样不会隐藏其内部结构,还有list,就像json一样
所以record的存在很尴尬,因为不提倡用,你不应该写出来
这是一,其次record即便要写,你也要写成json那样
各种扁平化,不依赖不继承,尽量immutable
从本质上说只是一个information的集合体
不是现实中对象的映射,所以说record是java里面的class纯粹就是生搬硬套
这么理解的话,显然oop的习惯影响了fp,仅仅因为都有new就说这两个是一样的
这个是错误的,fp的information的概念没有形成
其次oop
oop虽然有class,但是oop也已经逐步摆脱new这种做法了
之所以摆脱,一个重要原因就是func和entity的分离
spring就是管理func的工具,包装func的object缺... 阅读全帖 |
|
z****e 发帖数: 54598 | 44 会依次对比node.js, fp, spring, ejb和vert.x的解决方案,然后自己看哪个最好
从最基本的说起,所有语言都一定会有两个东西
一个是变量,我们用var(variable)来表示
另外一个是方法/函数,用func(function)表示
假设有一个函数和一个变量
var var1;
func func1(){
var1 = 0;
return var1+1;//应该是1
}
那现在如果有多个线程并发
那结果会怎样?
那在func1执行完var1 = 0;之后
就有可能有其他线程插入,把var1改成其他值
比如改成var1 = 2; 或者var1 = "goodbug乱入";
那瞬间func1返回值不再是1了,那这个显然是不可接受的
那怎么办?
第一种是fp的做法,fp说,把变量做成immutable
也就是var -> val(value),把var1改成
val1 = 0;
return val1+1;//就一定是1鸟
但是这样为了多线程把所有的参数都搞成immutable鸟
然后你写代码时候,需要时刻提醒自己
常量啊,常量啊,常量啊……
第二种是node.js等... 阅读全帖 |
|
z****e 发帖数: 54598 | 45 会依次对比node.js, fp, spring, ejb和vert.x的解决方案,然后自己看哪个最好
从最基本的说起,所有语言都一定会有两个东西
一个是变量,我们用var(variable)来表示
另外一个是方法/函数,用func(function)表示
假设有一个函数和一个变量
var var1;
func func1(){
var1 = 0;
return var1+1;//应该是1
}
那现在如果有多个线程并发
那结果会怎样?
那在func1执行完var1 = 0;之后
就有可能有其他线程插入,把var1改成其他值
比如改成var1 = 2; 或者var1 = "goodbug乱入";
那瞬间func1返回值不再是1了,那这个显然是不可接受的
那怎么办?
第一种是fp的做法,fp说,把变量做成immutable
也就是var -> val(value),把var1改成
val1 = 0;
return val1+1;//就一定是1鸟
但是这样为了多线程把所有的参数都搞成immutable鸟
然后你写代码时候,需要时刻提醒自己
常量啊,常量啊,常量啊……
第二种是node.js等... 阅读全帖 |
|
d****n 发帖数: 1637 | 46 http://zhuanlan.zhihu.com/thought/20010926
达达 · 6 天前
今天我要教大家一些无用技能,也可以叫它奇技淫巧或者黑魔法。用得好可以提升性能
,用得不好就会招来恶魔,嘿嘿。
黑魔法导论
为了让大家在学习了基础黑魔法之后能有所悟,在必要的时候能创造出本文传授之外的
属于自己的魔法,这里需要先给大家打好基础。
学习Go语言黑魔法之前,需要先看清Go世界的本质,你才能获得像Neo一样的能力。
在Go语言中,Slice本质是什么呢?是一个reflect.SliceHeader结构体和这个结构体中
Data字段所指向的内存。String本质是什么呢?是一个reflect.StringHeader结构体和
这个结构体所指向的内存。
在Go语言中,指针的本质是什么呢?是unsafe.Pointer和uintptr。
当你清楚了它们的本质之后,你就可以随意的玩弄它们,嘿嘿嘿。
第一式 - 获得Slice和String的内存数据
让我小试身手,你有一个CGO接口要调用,需要你把一个字符串数据或者字节数组数据
从Go这边传递到C那边,比如像这个:mysql/con... 阅读全帖 |
|
c*****t 发帖数: 1879 | 47 最近无聊,稍微研究了下两个语言,彻底被雷了。
第一是 R 。可以说是世界上最 fucked up 的语言之一(COBOL 是另外一个)。
你看一下这篇文章就明白了:
https://xianblog.wordpress.com/2010/09/13/simply-start-over-and-build-
something-better/
如果你非要写 R 代码。建议你把所有的 variable 都弄个 prefix 。免得你
不小心碰到这种麻烦事。
第二就是 Go 。整个一傻逼语言。
1) 如果该语言有 pointer,但是其速度比 Java 还慢点,谁 TMD 有病才用它。
再不用说,Go 里面需要知道很多很多 low level 的东西,但是搞了半天比 Java
还慢?!!
2) Stupid copies 。好吧,你有 pointer 不用,非得 pass by value (i.e.
struct copy),真是脑袋抽筋了。copy 大部分情况下比 reference 慢。
reference 是可以放在 register 里的,而 struct 一旦比 register... 阅读全帖 |
|
c*****t 发帖数: 1879 | 48 最近无聊,稍微研究了下两个语言,彻底被惊呆了。
第一是 R 。可以说是世界上最 fucked up 的语言之一(COBOL 是另外一个)。
你看一下这篇文章就明白了:
https://xianblog.wordpress.com/2010/09/13/simply-start-over-and-build-
something-
better/
第二就是 Go 。整个一傻逼语言。
1) 如果该语言有 pointer,但是其速度比 Java 还慢点,谁 TMD 有毛病才用它。
再不用说,Go 里面需要知道很多很多 low level 的东西,但是搞了半天比 Java
还慢?!!
2) Stupid copies 。好吧,你有 pointer 不用,非得 pass by value (i.e.
struct copy),真是脑袋抽筋了。copy 大部分情况下比 reference 慢。
reference 是可以放在 register 里的,而 struct 一旦比 register 大,
就会占内存。然后 Go idiots 说 cache 很 precious,那你还搞那么多 copy... 阅读全帖 |
|
k****i 发帖数: 101 | 49 package main
import (
"fmt"
"time"
)
type T interface{}
type P chan T
type F func(t T) T
func pf(f F, t T) P {
p := make(P)
go func() {
p <- f(t)
}()
return p
}
func main() {
f := func(t T) T {
time.Sleep(time.Second)
return t
}
pa, pb := pf(f, 1), pf(f, 2)
fmt.Println((<-pa).(int)+(<-pb).(int), time.Now())
a, b := <-pf(f, 3), <-pf(f, 4)
fmt.Println(a.(int)+b.(int), time.Now())
} |
|
c******e 发帖数: 545 | 50 打个比方说,地址在0x400000的函数当初是用__stdcall修饰的(比如win32平台上的
WINAPI宏,API函数默认修饰),那么声明指针的时候也要用相同修饰:
void (__stdcall*func)(int,int) = (void (__stdcall*)(int,int))0x400000;
func(10,100);
如果用系统默认__cdecl的话
void (*func)(int,int) = (void (*)(int,int))0x400000;
func(10,100);
生成的调用代码就完全不正确,原因见原帖。这种问题平时是见不到的,因为compiler
会核对原型,而且link的时候因为name mangling也通不过,但是因为指针强制赋值,
所以跳过了所有的检查,需要自己确定才行。 |
|