小编Amu*_*umu的帖子

如何在malloc之后获得内存块长度?

我以为我无法像.lengthJava中的简单函数那样检索分配的内存块的长度.但是,我现在知道,在malloc()分配块时,它会分配额外的字节来保存包含块大小的整数.该整数位于块的开头; 实际返回给调用者的地址指向刚刚超过此长度值的位置.问题是,我无法访问该地址来检索块长度.

#include <stdlib.h>
#include <stdio.h>
int main(void)
{
        char *str;
        str = (char*) malloc(sizeof(char)*1000);
        int *length;
        length = str-4; /*because on 32 bit system, an int is 4 bytes long*/
        printf("Length of str:%d\n", *length);
        free(str);
}
Run Code Online (Sandbox Code Playgroud)

**编辑:我终于做到了.问题是,它持续给出0作为长度而不是我系统上的大小是因为我的Ubuntu是64位.我将str-4更改为str-8,现在可以使用了.

如果我将大小更改为2000,则会生成2017年的长度.但是,当我改为3000时,它给出3009.我正在使用GCC.

c malloc

16
推荐指数
5
解决办法
3万
查看次数

什么是符号计算?

根据维基:

在数学和计算机科学中,计算机代数,也称为符号计算或代数计算,是指研究和开发用于操纵数学表达式和其他数学对象的算法和软件的科学领域.

符号计算是否专注于符号操作和计算?Lisp程序以AST的形式编写,原子为叶子.据说Lisp是符号计算的语言.这是否意味着在符号计算中,它是:

  • 所有关于符号(符号是Lisp中的原子或非原子表达式)
  • 每个符号都分配了一个语义
  • 符号计算是一种范式,它使程序员专注于处理符号和语义(语义可以是做某事的原子或表达式)和符号之间的关系,而不是认为数据结构和代码是两个独立的实体.
  • 程序设计是基于符号组合/操作和语义分配的语言设计.

根据这个问题,符号计算的反面是数值计算.这两者之间的主要区别是什么?当我使用Octave(我正在研究它)时,我必须经常使用数字并且必须多次猜测这些魔术数字的含义.这是数值计算的焦点吗?

symbolic-math

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

HANDLE与Linux中的文件描述符类似吗?

HANDLE与Linux中的文件描述符类似吗?据我所知,HANDLE用于处理Windows上的每个资源,例如字体,图标,文件,设备......,它实质上只是指向保存特定资源数据的内存块的void指针

c++ windows file-descriptor

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

使eshell标签完成的行为类似于Bash

我怎样才能使eshell自动完成功能像Bash和Emacs一样,即它提供一个选项列表而不是任意选择一个?

例如,如果我有两个目录"下载"和"下载",当我输入"向下"并点击TAB时,我希望弹出另一个缓冲区并向我显示选项.但是eshell只是为我完成它,即如果我按TAB,它就完成了"下载"; 再次点击TAB,它会变为"下载".

emacs eshell

13
推荐指数
2
解决办法
2585
查看次数

游戏引擎和数据驱动设计

我听说过数据驱动设计,并且已经研究了一段时间了.所以,我已经阅读了几篇文章来获取这些概念.

其中一篇文章是Kyle Wilson撰写的数据驱动设计.正如他所描述的那样,在我看来应该将应用程序代码(即用于控制资源的代码,例如内存,网络......)和游戏逻辑代码分开,并且游戏逻辑代码应该由外部数据源驱动.在这一点上,我可以想象开发人员会编写某种游戏编辑器,它接受有关游戏内对象的外部数据(如角色信息,武器信息,地图信息......).场景设计将由程序员编写的自定义语言/工具编写脚本,让游戏设计师在游戏对象之间创建交互.游戏设计师将使用现有的/自定义脚本语言为游戏编写脚本,或者使用拖放工具来创建游戏世界.我能想到的工具方法示例是World Editor,它通常与Bliizard的游戏一起打包.

但是,另一篇文章反对使用数据驱动设计,即针对数据驱动设计的案例.作者建议不要让游戏设计由数据驱动,因为开发游戏需要更多时间,因为游戏设计师有编程的负担.相反,将有一个游戏程序员从草图设计中自由编程游戏,并在游戏编程完成后由游戏设计师验证.他称这是程序员驱动的.我对这种方法的看法与我过去的做法类似:游戏逻辑是应用程序本身,与上述想法相关,应用程序是游戏编辑器,实际游戏是基于工具设计的.

对我来说,第一种方法似乎更合理,因为游戏组件可以重复用于许多项目.对于反对数据驱动设计的第二种方法,游戏代码仅属于该游戏.这就是为什么我认为魔兽有很多游戏类型,比如原版魔兽和各种自定义地图,以及其中最着名的一个:DOTA实际上定义了一种新类型.出于这个原因,我听到人们称世界编辑是游戏引擎.这是真的游戏引擎应该如何?

所以,在所有这些之后,我只想验证我对这些想法(数据驱动,程序员驱动,脚本等)的理解是否有任何缺陷?

data-driven game-engine

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

Web服务器中的proactor模式与同步模型的区别

在同步模型中,当客户端连接到服务器时,客户端和服务器都必须彼此同步才能完成某些操作.

同时,异步模型允许客户端和服务器分离和独立地工作.客户端发送建立连接的请求并执行某些操作.当服务器正在处理请求时,客户端可以执行其他操作.完成操作后,将完成事件放置在事件解复用器中的队列中,等待Proactor(例如HTTP处理程序)发回请求并调用完成处理程序(在客户端上).这些术语在boost :: asio文档中使用.Proactor设计模式:没有线程的并发.

通过这种方式,异步模型可以接受同时连接,而无需为每个连接创建一个线程,从而提高整体性能.为了实现与异步模型相同的效果,第一个模型(同步)必须是多线程的.有关更多详细信息,请参阅:Proactor Pattern(我实际上学习了用于该文档的异步模型的proactor模式.在这里它描述了典型的同步I/O Web服务器).

我对这个问题的理解是否正确?如果是这样,这意味着异步服务器可以接受请求并异步返回结果(第一个连接请求Web服务器上的服务不需要是第一个回复的)?本质上,异步模型不使用线程(或者在单个组件中使用线程,例如在Proactor,异步事件多路复用器(boost :: asio文档)组件中,而不是通过创建整个客户端 - 服务器应用程序堆栈,这是描述在Proactor Pattern文档的多线程模型中,第2.2节 - 常规并发模型的常见陷阱和陷阱).

c++ webserver multithreading boost-asio

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

在Boost :: thread中究竟是什么join()?(C++)

在Java中,我会做类似的事情:

Thread t = new MyThread();
t.start();
Run Code Online (Sandbox Code Playgroud)

我通过调用start()方法启动线程.所以后来我可以这样做:

for (int i = 0; i < limit; ++i)
{
    Thread t = new MyThread();
    t.start();
}
Run Code Online (Sandbox Code Playgroud)

创建一组线程并在run()方法中执行代码.

但是,在C++中,没有start()方法.使用Boost,如果我想要一个线程开始运行,我必须调用join()方法才能使线程运行.

#include <iostream>
#include <boost/thread.hpp>

class Worker
{
public:
    Worker() 
    {
        // the thread is not-a-thread until we call start()
    }

    void start(int N)
    {
        m_Thread = boost::thread(&Worker::processQueue, this, N);
    }

    void join()
    {
        m_Thread.join();
    }

    void processQueue(unsigned N)
    {
        float ms = N * 1e3;
        boost::posix_time::milliseconds workTime(ms);

        std::cout << "Worker: started, will work …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading boost

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

符号"#!"是什么 用Python表示?

这行代码是什么意思?没有它,我的python3 http服务器无法理解,让浏览器下载一个空的.py文件(取决于.py文件的链接)

#! /usr/local/bin/python3
Run Code Online (Sandbox Code Playgroud)

python shebang

10
推荐指数
3
解决办法
4166
查看次数

即使文件有行,GDB仍会生成"文件中没有行xx"错误

这真的很烦人.我得到了几个文件,我不明白为什么.这是一个示例源代码.(请不要关心内容,只需复制并粘贴并在my_atoi函数中的某处设置断点,gdb将不允许设置断点).my_atoi使用十进制,八进制和十六进制数字,将一个C风格的字符串转换为一个数字的表示,并将这些字符串转换为整数(这只是为了练习.我不会使用它,所以不要担心) .为了正确测试它,请在命令行中输入参数.ie

./my_atoi 0x12
Run Code Online (Sandbox Code Playgroud)

这是编译命令:

g++ -g -o my_atoi my_atoi.cpp
Run Code Online (Sandbox Code Playgroud)

这是gdb命令:

gdb -r --annotate=3 my_atoi
Run Code Online (Sandbox Code Playgroud)

我启用了-r用于遇到类似错误的另一个文件,并且它已修复(我不明白为什么).但是,不是这种情况.我通过emacs运行gdb.我不认为这是问题所在.

这是源代码:

#include <iostream>
#include <string.h>
#include <string>

using namespace std;
int my_atoi(const char *str);
int main(int argdigit, char *argv[])
{
    char *num_str = argv[1];
    string test;
    int num = my_atoi(num_str);
    cout <<  num << '\n';
    return 0;
}

int my_atoi(const char *str){
    int total = 0;
    int base, digit;
    char c;
    while (isspace(*str)) ++str;
//if you put a breakpoint from this line …
Run Code Online (Sandbox Code Playgroud)

c++ gdb

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

为什么在内存中的类对象已经是二进制(C/C++)时进行序列化?

我的猜测是数据分散在物理内存中(即使类对象的数据在虚拟内存中是顺序的),因此为了正确发送数据,需要重新组装,并且能够通过网络发送数据附加步骤是将主机字节顺序转换为网络字节顺序.这是对的吗?

c c++ serialization

9
推荐指数
2
解决办法
1012
查看次数