C语言 创建一个从另一个对象文件返回指向静态全局变量的指针的函数有什么好处和缺点?

jhkqcmku  于 2023-03-22  发布在  其他
关注(0)|答案(3)|浏览(147)

我之所以考虑这样做,是因为它符合我的划分思想,所以我试图弄清楚这是否是一个好主意。

// obj1.c
static char *data;

char* return_pointer_for_data() {
    return data;
}

// obj2.c
static char *buffer;

void copy_data_to_buffer(char* ptr) {
    buffer[5] = ptr[5];
}

// main.c
copy_data_to_buffer(return_pointer_for_data());

我想知道做return_pointer_for_data()的好处和缺点,以及这种方法有多常见。我想到的另一种方法是:

// obj2.c
void copy_data_to_buffer(char* ptr1, char* ptr2) {
    ptr1[5] = ptr2[5];
}  

// main.c
char *data;
char *buffer;
copy_data_to_buffer(buffer, data);

我已经得到了关于复制数据的访问速度比较的答案,从“高度依赖”到“无关紧要”,所以我决定根据return_pointer_for_data()的优点和缺点做出决定。

vql8enpb

vql8enpb1#

好处:
1.易于通过函数共享数据,您不必在每次调用函数时都传递char*
缺点:
1.如果你的程序有多个线程,它可能会导致一个竞争条件,因为多个线程可以写它在同一时间。你必须使用锁来保护它。
1.当你的代码增长时,它会使你的代码很难维护。你需要仔细地安排你的函数调用,因为它们可能需要其他函数来设置全局变量。
在这种情况下,性能并不太重要,第一种方法具有函数调用的开销。

k4ymrczo

k4ymrczo2#

不去想微观优化,想想程序设计和架构(+算法)

htzpubme

htzpubme3#

好了,这里是基本问题-假设明显的问题(没有为指针分配内存)是固定的:

// obj1.c
static char *data;

char* return_pointer_for_data() {
    return data;
}

// obj2.c
static char *buffer;

void do_something_with_ptr(char* ptr) {
    buffer[5] = ptr[5];
    ...some stuff happens...
    // Reset for next time.
    memset(buffer, 0, sizeof(actual_buffer_size);
}

void im_new_here(char* ptr) {
    buffer = ptr;
    ...some stuff happens...
    // Reset for next time.
    memset(buffer, 0, sizeof(actual_buffer_size);
}

// main.c
// Bug - got to do this first.
i'm_new_here(return_pointer_for_data());
do_something_with_ptr(return_pointer_for_data());

如果你没有看到发生了什么,第一个函数会清除ptr所指向的任何东西(并且可能会覆盖结束和崩溃的东西),使其对进一步的调用毫无用处。什么可以阻止这种情况发生?除了上去告诉新来的家伙“这里的事情不是这样工作的”,因为这可能是在你做其他事情的几年之后,不能这样做。
所以如果你想做到这一点,让你的设计万无一失,坚不可摧。

相关问题