小编Cla*_*ese的帖子

使用const参数将参数传递给函数:它更快吗?

例如,考虑一下:

int sum(int a, int b)
{
    return a + b;
}
Run Code Online (Sandbox Code Playgroud)

int sum(const int a, const int b)
{
    return a + b;
}
Run Code Online (Sandbox Code Playgroud)

第二种方法通常更快吗?

C中的函数参数被复制并发送到函数,因此函数内部的更改不会影响原始值.我的理由是,在sum上面的第二个中,编译器确实知道a并且b没有在函数内部进行修改,所以它只能传递原始值而不先复制它们.这就是为什么我认为第二个sum比第一个更快.但我真的不知道.在sum上面特别简单的例子中,差异(如果有的话)应该是最小的.

编辑:这个sum例子只是为了说明我的观点.我不希望在这个特定的例子中应该有很大的差异.但我想知道在更复杂的情况下const,编译器是否可以利用函数参数中的修饰符来使函数更快.我怀疑编译器总能确定一个参数是否在一个函数内被改变(因此我的第二个问题在下面); 因此我希望当它找到一个const修饰符时,它会做出与没有const修饰符时不同的东西.

问题:一般来说,一个函数在它的参数时会const比它们不是时更快?

问题2:通常,C编译器(理论上)是否总能确定函数内是否更改了函数参数?

c const function-parameter

21
推荐指数
2
解决办法
2万
查看次数

将枚举与字符串关联的正确方法

假设我在整个程序中经常使用一些字符串(用于存储状态和类似的东西).字符串操作可能很昂贵,所以无论何时解决它们我都想使用枚举.到目前为止,我已经看到了几个解决方案:

typedef enum {
    STRING_HELLO = 0,
    STRING_WORLD
} string_enum_type;

// Must be in sync with string_enum_type
const char *string_enumerations[] = {
    "Hello",
    "World"
}
Run Code Online (Sandbox Code Playgroud)

我经常遇到的另一个:

typedef enum {
    STRING_HELLO,
    STRING_WORLD
} string_enum_type;

const char *string_enumerations[] = {
    [STRING_HELLO] = "Hello",
    [STRING_WORLD] = "World"
}
Run Code Online (Sandbox Code Playgroud)

这两种方法的缺点是什么?还有更好的吗?

c enums c-strings

19
推荐指数
1
解决办法
1186
查看次数

golang strings.Builder类型undefined

我在使用了GO中的strings.Builder类型时遇到了问题.

尝试逐字运行示例代码,GO仍然响应:

undefined:strings.Builder

有关问题的任何线索,根本没有其他问题.

package main

import (
    "fmt"
    "strings"
)

func main() {

    var b strings.Builder
    for i := 3; i >=1; i-- {
        fmt.Fprintf(&b, "%x...", i)
    }
    b.WriteString("ignition")
    fmt.Println(b.String())
}
Run Code Online (Sandbox Code Playgroud)

go

14
推荐指数
1
解决办法
7701
查看次数

在C中使用结构

我正在阅读关于malloc(first-fit)实现的脚本,我对元数据结构的值赋值有点困惑.任何人都可以给出一些解释为什么malloc返回flag_block->ptr(作为指向已分配内存的指针)?据我所知,没有具体的任务.

typedef struct _metadata {
    size_t size;
    char free;
    struct _metadata* next;
    struct _metadata* prev;
    char ptr[];
} metadata;

metadata* flag_block = NULL; 

void *malloc(size_t size)
{
    if (size==0) {
        return NULL;
    }

    if (flag_block == NULL) {
        flag_block = sbrk(size);
        sbrk(sizeof(metadata));
        if (flag_block == (void *)-1) {
            return NULL;
        }
        flag_block->free = 0;
        flag_block->next=NULL;
        flag_block->prev=NULL;
        flag_block->size = size;
        return flag_block->ptr;
    } else {

    /* 
        ....
    */

    }
}
Run Code Online (Sandbox Code Playgroud)

c malloc struct

7
推荐指数
1
解决办法
92
查看次数

\ c转义序列在man中列出但在C中未知

我正在学习C,如果这个问题看似简单或新手,那么你就知道为什么了.

阅读手册页printf的我发现\ C列为转义序列.它的描述是

不产生进一步的产出

在此之前我从未见过和听说过\ c.所以我决定在一个简单的hello world程序中试一试:

printf("\nHello World\n\n\c");
Run Code Online (Sandbox Code Playgroud)

结果,gcc给了我这个警告:

警告:未知转义序列:'\ c'[默认启用]

这对我来说听起来很奇怪,所以我进一步调查了:我去了维基百科并且\ c没有被列为转义序列...因此我尝试在网上搜索,并在堆栈溢出.我发现很少提及\ C(实际上是两个)在讨论这个话题这一个(我认为后者没有真正涉及到C,但似乎大家都在谈论"同一\ C ",阅读给出的描述).有人可以帮我理解这件事吗?

c printf escaping gcc-warning

5
推荐指数
1
解决办法
459
查看次数

初始化变量和指针为NULL或0之间有区别吗?

以下哪种方法是更正确的初始化变量的方法?

int x = 0;
int x = NULL;
Run Code Online (Sandbox Code Playgroud)

指针怎么样?我被告知不和谐的事情NULL,比如:" NULL最好初始化指针"或"不要使用NULL但是0来初始化变量"等等......现在,我在互联网上读到的NULL等于0和我测试了我自己.那有什么意义呢?为什么有些人说使用NULL不是一个好选择?有什么东西我不见了吗?

c variables pointers initialization null-pointer

3
推荐指数
1
解决办法
96
查看次数

将 Redux 与 React Hooks 一起使用时的无限 useEffect 循环

我正在重构一些代码并将我的类组件转换为函数组件,以此作为学习如何使用 Hooks 和 Effects 的一种方式。我的代码使用 Redux 进行状态管理,使用 axios 进行数据库请求,使用 Thunk 作为中间件处理异步性。我在一个组件中遇到问题,该组件执行 get 请求以检索过去的客户列表componentDidMount。无论我尝试什么,该useEffect函数都会进入无限循环并继续请求客户列表。

有问题的组件CustomersTable从数据库中获取客户列表并将其显示在表格中。该组件由容器组件包装,该组件使用 Redux 的连接将检索到的客户列表CustomersTable作为道具传递给。

useEffect(() => {
    loadCustomers(currentPage, itemsPerPage, sortProp, (ascending ? 'asc' : 'desc'), {});
  }, []);
Run Code Online (Sandbox Code Playgroud)

loadCustomers 是一个 Redux 操作,它使用 axios 来获取客户列表。currentPage、itemsPerPage、sortProp 和升序是初始化为“组件安装”上特定值的状态变量

我希望这是因为我使用空数组,它只会运行一次。相反,它会持续运行。我不明白为什么会这样。我最好的猜测是,当 redux 获取列表时,它返回一个新的 state 对象,因此 props 每次都会改变,然后触发重新渲染,然后获取一个新列表。我使用这个错误是因为 Redux 不打算与这样的钩子一起使用吗?

我最终通过添加以下内容来完成这项工作:

useEffect(() => {
    if (!list.length) {
      loadCustomers(currentPage, itemsPerPage, sortProp, (ascending ? 'asc' : 'desc'), {});
    }
  }, []);
Run Code Online (Sandbox Code Playgroud)

我不确定这是我真正想要的行为。如果客户列表确实为 0,则代码将继续获取列表。如果列表真的是空的,那么我希望它只获取一次然后停止。编辑:事实证明这绝对行不通。它适用于初始加载,但会破坏任何删除或编辑的代码。

好的,在此处提供更多上下文。包装客户表的容器组件是:

import { connect } …
Run Code Online (Sandbox Code Playgroud)

reactjs redux react-hooks

2
推荐指数
1
解决办法
4165
查看次数

fgets 有更好的替代品吗?

我只是一名年轻的计算机科学学生,目前我对从stdin读取字符串的最佳实践有点困惑。我知道有很多方法可以做到这一点,有些方法比其他方法更安全,等等...我目前需要一个函数来防止缓冲区溢出并在末尾附加一个空终止符(\0)字符串的。我发现fgets对此非常有用,但是......它会停止读取 \n 或 EOF!如果我希望用户一次输入多行怎么办?还有其他功能可以帮助我做到这一点吗?如果这个问题对你们中的一些人来说似乎很愚蠢,我很抱歉,但是请理解我!任何帮助,将不胜感激。

c string fgets

1
推荐指数
1
解决办法
1万
查看次数

c ++与双精度和整数的隐式转换混淆

我一直在研究c ++,我遇到了一个我不理解的隐式转换问题.在这段代码中:

#include <iostream>
using namespace std;
int main(){
    int i;
    i = 1 / 2 * 2 / 1. * 2. / 4 * 4;
    cout << i << endl;

    i = 3.5 + 2 + 1.6;
    cout << i << endl;

    i = 2 + 3.5 + 1.6;
    cout << i << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它的输出分别为:0,7和7.

在最后两个示例中,编译器隐式地将元素转换为双精度数,因此sum = 7.1,然后将其转换为int以获得7.

因为第一个例子也有双打,我希望所有这些元素也被转换为双精度,并且总和为2.0,然后被强制转换为2,但结果为0,所以看起来似乎是"1/2" "被视为整数,给出结果为0.我不确定这是编译器正在做什么,但这就是它的样子.

我认为如果任何元素是double,编译器会隐式地将所有元素转换为double.但是在第一种情况下不会发生这种情况.有人可以解释为什么编译器会以不同方式转换它们 谢谢.

c++

1
推荐指数
1
解决办法
148
查看次数

C - 通过引用传递struct

我试图在C中通过引用传递结构,以便我可以修改函数内的值.这是我到目前为止的代码,但它会产生一些警告和一个错误.

main.c中

#include <stdio.h>
#include "myfunctions.h"
#include "structures.h"

int main(int argc, char const *argv[] {

    struct MyStruct data;

    data.value = 6;

    printf("Before change: %d\n", data.value);

    changeData(data);

    printf("After change: %d\n", data.value);

}
Run Code Online (Sandbox Code Playgroud)

myfunctions.c

#include "structures.h"

void changeData(MyStruct data) {
    data.value = 7;
}
Run Code Online (Sandbox Code Playgroud)

myfunctions.h

#ifndef MyStruct
#define MyStruct

void changeData(MyStruct data);

#endif
Run Code Online (Sandbox Code Playgroud)

structures.h

typedef struct {

    int value;

} MyStruct;
Run Code Online (Sandbox Code Playgroud)

产生的错误

In file included from main.c:2:0:
myfunctions.h:4:1: warning: parameter names (without types) in function declaration
 void changeData(MyStruct data);
 ^
In file …
Run Code Online (Sandbox Code Playgroud)

c struct pass-by-reference

0
推荐指数
1
解决办法
1465
查看次数

C中此指针程序中的分段错误

每当我尝试运行此C程序时,我都会收到分段错误(核心转储)消息.

#include <stdio.h>

int main()
{
    int i = 200, *p, *q, *r;
    p,r = &i;
    q = p;
    *q = *p + 1;
    printf("*p = %d\n", *p);
    printf("*r = %d\n", *r);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它没有任何r的第一秒,但我不得不添加rS作为一个别名i,然后打印语句添加到输出的提领值qr.

c pointers initialization segmentation-fault

0
推荐指数
1
解决办法
84
查看次数

原子自由记忆

这是一个函数,我用来释放动态分配的内存

void Free(void* arg) {
    if(arg!=NULL) {
        free(arg);
        arg=NULL;
    }
}
Run Code Online (Sandbox Code Playgroud)

到目前为止它工作正常,直到我开始使用pthreads.我的堆栈有时会被粉碎,我唯一能做的就是使用pthread_mutex_lock()
是否有任何原子公告来检查和释放gcc中的内存?
或者您可以提出另一种解决方案?我希望互斥体不是唯一的方法

c memory-management pthreads

0
推荐指数
1
解决办法
123
查看次数