小编jak*_*gut的帖子

宣告指针; 类型和名称之间的空格左侧或右侧的星号?

可能的重复:
什么更有意义 - char*string或char*string? C++中的指针声明:星号的放置

我已经在很多代码中看到了这个的混合版本.(顺便说一下,这适用于C和C++.)人们似乎用两种方式之一来声明指针,我不知道哪一个是正确的,如果它甚至是重要的.

第一种方法是将星号放在类型名称旁边,如下所示:

someType* somePtr;
Run Code Online (Sandbox Code Playgroud)

第二种方法是将星号放在变量名称旁边,如下所示:

someType *somePtr;
Run Code Online (Sandbox Code Playgroud)

这已经让我疯了一段时间了.是否有任何标准方法来声明指针?甚至指针是如何声明的?我之前使用过两个声明,并且我知道编译器并不关心它是哪种方式.然而,事实上,我已经看到以两种不同的方式宣告指针,这让我相信它背后有一个原因.我很好奇,如果任何一种方法在某些方面更具可读性或逻辑性,那我就错过了.

c c++ pointers

116
推荐指数
5
解决办法
6万
查看次数

如何在x86程序集中编写自修改代码

我正在为最近一直在研究的业余爱好虚拟机编写JIT编译器.我知道有点汇编,(我主要是一个C程序员.我可以阅读大多数汇编参考我不理解的操作码,并编写一些简单的程序.)但我很难理解这几个例子我在网上找到的自修改代码.

这是一个这样的例子:http://asm.sourceforge.net/articles/smc.html

提供的示例程序在运行时进行了大约四种不同的修改,其中没有一个被清楚地解释.Linux内核中断被多次使用,没有解释或详细说明.(作者在调用中断之前将数据移动到几个寄存器中.我假设他正在传递参数,但这些参数根本没有解释,让读者猜测.)

我正在寻找的是自修改程序代码中最简单,最直接的例子.我可以看到的东西,用于理解如何编写x86程序集中的自修改代码,以及它是如何工作的.您是否有任何资源可以指向我,或者您可以提供的任何示例都能充分证明这一点?

我正在使用NASM作为我的汇编程序.

编辑:我也在Linux上运行此代码.

x86 assembly jit self-modifying vm-implementation

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

在程序集中编写JIT编译器

我用C编写了一个虚拟机,它对非JIT VM有很好的性能,但我想学习一些新东西,并提高性能.我当前的实现只是使用一个开关从VM字节码转换为指令,并将其编译为跳转表.就像我说的那样,它的性能不错,但是我遇到了一个只能用JIT编译器克服的障碍.

不久前我已经问了一个关于自我修改代码的类似问题,但我开始意识到我并没有问正确的问题.

所以我的目标是为这个C虚拟机编写一个JIT编译器,我想在x86汇编中完成它.(我使用NASM作为我的汇编程序)我不太确定如何去做这个.我对汇编感到满意,并且我已经查看了一些自我修改的代码示例,但我还没有弄清楚如何进行代码生成.

到目前为止,我的主要部分是使用我的参数将指令复制到可执行的内存块.我知道我可以在NASM中标记某一行,并使用静态参数从该地址复制整行,但这不是非常动态的,并且不适用于JIT编译器.我需要能够解释字节码中的指令,将其复制到可执行内存,解释第一个参数,将其复制到内存,然后解释第二个参数,并将其复制到内存中.

我已经了解了几个可以简化这项任务的库,比如GNU闪电,甚至是LLVM.但是,在使用外部资源之前,我想首先手动编写,以了解它是如何工作的.

这个社区可以提供任何资源或示例来帮助我开始这项任务吗?一个简单的例子显示了两个或三个指令,例如"add"和"mov"用于生成可执行代码,带有参数,动态地,在内存中,会产生奇迹.

c assembly jit code-generation self-modifying

23
推荐指数
2
解决办法
5232
查看次数

GCC在类似架构上使用"-march = native"发出大不相同的代码

我正在用C编写OpenCL基准测试.目前,它测量CL设备和使用C代码的系统处理器的融合乘法累加性能.然后交叉检查结果的准确性.

我编写了本机代码以利用GCC的自动矢量化器,它可以工作.但是,我注意到GCC在"-march = native"标志中有一些奇怪的行为.

这是我的循环:

#define BUFFER_SIZE_SQRT 4096
#define SQUARE(n) (n * n)

#define ROUNDS_PER_ITERATION 48

static float* cpu_result_matrix(const float* a, const float* b, const float* c)
{
    float* res = aligned_alloc(16, SQUARE(BUFFER_SIZE_SQRT) * sizeof(float));

    const unsigned buff_size = SQUARE(BUFFER_SIZE_SQRT);
    const unsigned round_cnt = ROUNDS_PER_ITERATION;

    float lres;
    for(unsigned i = 0; i < buff_size; i++)
    {
        lres = 0;
        for(unsigned j = 0; j < round_cnt; j++)
        {
            lres += a[i] * ((b[i] * c[i]) + b[i]);
            lres += b[i] …
Run Code Online (Sandbox Code Playgroud)

c assembly gcc sse avx

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

最快的基本转换方法?

现在我正在开发一个项目,它需要一个整数转换为基本62字符串,每秒多次.转换完成得越快越好.

问题是,我有一个很难让我自己的基地转换方法是快速可靠的.如果我使用字符串,它通常可靠且运行良好,但速度很慢.如果我使用char数组,它通常要快得多,但它也非常混乱,并且不可靠.(它会产生堆损坏,比较应匹配的字符串返回负数等)

那么从一个非常大的整数转换为一个基本的62键,最快,最可靠的方法是什么?将来,我计划在我的应用程序中使用SIMD模型代码,这个操作是否可以并行化?

编辑:此操作每秒执行数百万次; 一旦操作完成,它就会再次作为循环的一部分开始,因此运行得越快越好.被转换的整数具有任意大小,并且可以容易地与128位整数(或更大)一样大.

编辑:这是我目前正在使用的功能.

char* charset = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
int charsetLength = (int)(strlen(charset));

//maxChars is an integer specifying the maximum length of the key
char* currentKey = new char[maxChars];

void integerToKey(unsigned long long location)
{
    unsigned long long num = location;
    int i = 0;

    for(; num > 0; i++)
    {
            currentKey[i] = charset[num % (charsetLength)];
            num /= charsetLength + 1;
    }

    currentKey[i + 1] = '\0';
}
Run Code Online (Sandbox Code Playgroud)

我从一个属于我的应用程序的类中删除了这个,并修改了一些代码,以便它没有意义而没有它的拥有类.

c++ base

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

四个无符号整数的散列函数(C++)

我正在编写一个程序,它产生四个无符号32位整数作为某个函数的输出.我想要散列这四个整数,所以我可以将这个函数的输出与未来的输出进行比较.

我在编写一个像样的散列函数时遇到了麻烦.当我最初编写这段代码时,我简单地添加了四个整数中的每一个,我知道这是不够的.我尝试了其他几种技术,例如转移和添加,但无济于事.我得到一个哈希,但质量很差,而且这个功能产生了大量的碰撞.

散列输出可以是32位或64位整数.所讨论的函数会产生数十亿个哈希值,因此冲突在这里是一个真正的问题,我愿意使用更大的变量来确保尽可能少的冲突.

任何人都可以帮我弄清楚如何编写一个高质量的哈希函数?

c++ hash integer

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

被称为纯虚方法

编辑:已解决

我现在正在开发一个多线程项目,我有一个基础工作者类,具有从中继承的不同工作类.在运行时,工作类成为线程,然后根据需要执行工作.

现在,我有一个我写过的Director,它应该维护一个指向所有worker的指针数组,以便它可以从中检索信息,以及稍后修改它们中的变量.

我通过创建指向基类指针的指针来完成此操作:

baseWorkerClass** workerPtrArray;
Run Code Online (Sandbox Code Playgroud)

然后在Director的构造函数中,我动态地为基础worker类分配一个指针数组:

workerPtrArray = new baseWorkerClass*[numWorkers];
Run Code Online (Sandbox Code Playgroud)

在每个工作线程的构造函数中,worker调用director中的一个函数,该函数用于将该worker的指针存储在数组中.

以下是导演存储指针的方式:

Director::manageWorker(baseWorkerClass* worker)
{
    workerPtrArray[worker->getThreadID()] = worker;
}
Run Code Online (Sandbox Code Playgroud)

以下是工人变体的示例.每个worker都继承自基类worker类,而base worker类包含纯虚函数,这些函数应该存在于所有worker变量中,以及一些在所有worker之间共享的变量.

class workerVariant : protected baseWorkerClass
{
    public:

    workerVariant(int id)
    : id(id)
    {
        Director::manageWorker(this);
    }

    ~workerVariant()
    {
    }

    int getThreadID()
    {
        return id;
    }

    int getSomeVariable()
    {
        return someVariable;
    }

    protected:

    int id;
    int someVariable
};
Run Code Online (Sandbox Code Playgroud)

然后baseWorkerClass看起来像这样:

class baseWorkerClass
{
public:

    baseWorkerClass()
    {
    }

    ~baseWorkerClass()
    {
    }

    virtual int getThreadID() = 0;
    virtual int getSomeVariable() = 0;
};
Run Code Online (Sandbox Code Playgroud)

在每个worker变量完成初始化之后,我应该得到一个指向baseWorkerClass对象的指针数组.这意味着我应该能够,例如,使用其ID作为数组的索引来获取某个工作中给定变量的值,如下所示: …

c++ inheritance multithreading pure-virtual

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

在C++中编写可移植动态可加载库的最简单方法是什么?

我正在开发一个具有多个类似代码路径的项目,我想将它从主项目分离到插件中.该项目必须保持跨平台兼容,我所研究的所有动态库加载API都是特定于平台的.

创建动态库加载系统的最简单方法是什么,可以在多个操作系统上编译和运行而无需额外修改代码?理想情况下,我想编写一个插件,并使其适用于项目支持的所有操作系统.

谢谢.

c++ plugins portability shared-libraries dynamic-loading

6
推荐指数
2
解决办法
1079
查看次数

无法在嵌入式设备上为SDL屏幕设置视频模式

过去几天,我一直在使用内置屏幕的基于ARM的设备(Freescale i.MX27 ADS)进行攻击.该设备运行的是经过修改的最小GNU/Linux系统,没有窗口管理或图形服务器.默认情况下,设备只应运行随附的一个应用程序.

我之前从未做过任何图形编程,所以这对我来说是一次学习经历.我尝试编写一个简单的SDL程序在设备上运行,该程序将读取位图,并在嵌入式设备的屏幕上显示图像.

我遇到的问题是无论我尝试什么分辨率,深度或标志,视频模式总是无法应用,我什么也得不到.

我知道我的代码不是问题,但无论如何我都要发布它.

#include "SDL/SDL.h"

#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480
#define SCREEN_DEPTH 24

int main(int argc, char *argv[])
{
    SDL_Surface *screen;

    if(!SDL_Init(SDL_INIT_VIDEO))
    {
            printf("Unable to initialize SDL.\n");
            return 1;
    }

    // It always fails right here
    screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_DEPTH, SDL_SWSURFACE);
    if(screen == NULL)
    {
            printf("Unable to set video mode.\n");
            return 1;
    }

    SDL_Surface* image;
    SDL_Surface* temp;

    temp = SDL_LoadBMP("hello.bmp");
    if(temp == NULL)
    {
            printf("Unable to load bitmap.\n");
            return 1;
    }

    image = SDL_DisplayFormat(temp);
    SDL_FreeSurface(temp); …
Run Code Online (Sandbox Code Playgroud)

c embedded graphics arm sdl

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

如何将C函数公开给自定义虚拟机?

我正在研究一个我希望能够与C接口的虚拟机.走另一条路,将虚拟机功能暴露给C代码相当容易,我无法解决的问题是将C函数暴露给一台虚拟机.

我希望能够像虚拟机一样动态注册C函数:

vm_register(printf);
Run Code Online (Sandbox Code Playgroud)

然后在我的虚拟机中,将参数推送到堆栈,并且:

call printf
Run Code Online (Sandbox Code Playgroud)

问题是,在不知道函数需要多少个参数以及什么类型的情况下,我不确定可以使用函数指针.

是否存在可在此情况下使用的通用函数指针类型?有人能引导我朝着正确的方向前进吗?

c function-pointers interface vm-implementation

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