+ -
当前位置:首页 → 问答吧 → 请问,内核中结构体变量为什么可以这样写 struct task_struct *p; *p = *current;

请问,内核中结构体变量为什么可以这样写 struct task_struct *p; *p = *current;

时间:2008-07-23

来源:互联网

请问,内核中结构体变量为什么可以这样写 struct task_struct *p; *p = *current;
int do_fork(unsigned long clone_flags, unsigned long stack_start,
struct pt_regs *regs, unsigned long stack_size)
{
int retval = -ENOMEM;
struct task_struct *p;
DECLARE_MUTEX_LOCKED(sem);

if (clone_flags & CLONE_PID) {
/* This is only allowed from the boot up thread */
if (current->pid)
return -EPERM;
}

current->vfork_sem = &sem;

p = alloc_task_struct();
if (!p)
goto fork_out;

*p = *current;

作者: xiachongbaogc   发布时间: 2008-07-23

因为需要拷贝task_struct阿

作者: gradetwo   发布时间: 2008-07-23

再请问下。在应用程序中,结构体的拷贝是通过 memcpy 来实现。难道在内核中它可以直接用 “ = ”来拷贝相同类型的结构体 ? 我只知道到 C++可以重载 "=" 来达到该目的。

作者: xiachongbaogc   发布时间: 2008-07-24

楼主只要考虑这样一个问题就可以了
代码:
struct T {
 int x, y;
};

struct T a, b;

a = b;
楼主认为这是否合乎语法呢?

再考虑一个问题
代码:
struct T {
 int x, y;
};

void fn1(struct T a)
{
 printf("%d\n", a.x);
}
void fn2(struct T * p)
{
 printf("%d\n", p->x);
}
一般都会建议使用 fn2 的形式, 而不是 fn1, 楼主想想这是为什么?

最后再想一想, 下面的例子中, fn1 和 fn2 是否能够达到预期的效果, 为什么?
代码:
struct T {
 int x, y;
};

void fn1(struct T a)
{
 a.x = 0;
}
void fn2(struct T * p)
{
 p->x = 0;
}

作者: remote fish   发布时间: 2008-07-24

上面的代码我多试过了,确实可以直接赋值。 建议使用 fn2 的形式, 而不是 fn1, 是因为实参传递给行参时,使用指针能节省空间和时间。fn2只要把指针赋值给行参,而fn1却要把 Struct T赋值给行参。

在此谢谢 两位。

作者: xiachongbaogc   发布时间: 2008-07-24

=是赋值,就是内存拷贝,无论C和C++都可以直接用。
C++会为每一个类自动生成=

==是没有的

作者: hanchao3c   发布时间: 2008-08-12

另外回复5楼,
void fn1(struct T a)
{
a.x = 0;
}
这个不仅仅是性能的问题,这种做法是错的,因为a在fn1的栈上(复制的),不可能传出去。

在c++中用得是拷贝构造

作者: hanchao3c   发布时间: 2008-08-12

其实*q = *current;就相当于memcpy(current, q, sizeof(struct task_struct));

作者: iamljj   发布时间: 2009-03-01