小编Lis*_*ing的帖子

本地禁用填充

我为一些数据结构编写了一个解析器,经过几个小时的调试后我发现问题是Visual Studio没有像我说的那样解释结构.似乎使用了一些"填充"

struct foo { 
unsigned char a; //0x00
unsigned char b; //0x01
unsigned int c; //0x02
unsigned int d; //0x06
unsigned int e; //0x0A
unsigned int f; //0x0E
//0x12
};
Run Code Online (Sandbox Code Playgroud)

我期望"sizeof(foo)= 4*4 + 2 = 18",但我得到"sizeof(foo)= 20".是否有可能为这个特殊结构转换填充?我试过了

__declspec(align(1)) struct foo { ...
Run Code Online (Sandbox Code Playgroud)

但它不起作用.谢谢您的帮助.

c++ visual-studio-2010 visual-studio

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

替代std :: set没有内存重新分配?

在一个应用程序中,我详尽地生成了许多子问题,并使用"std :: set"操作解决它们.为此,我需要" 插入 "和" 查找 "元素,并在排序列表上" 迭代 ".

问题是,对于数百万个子问题中的每一个,"std :: set"实现每次在集合中插入元素时都会分配新内存,这会使整个应用程序变得非常慢:

{   // allocate a non-value node
    _Nodeptr _Pnode = this->_Getal().allocate(1); // <- bottleneck of the program
Run Code Online (Sandbox Code Playgroud)

是否有一些stl-structure允许我在"O(log(n))"中执行上述操作而不重新分配任何内存?

c++ stl set data-structures c++11

15
推荐指数
2
解决办法
3196
查看次数

编译时字符串加密

我不希望逆向工程师在我的应用程序中读取硬编码字符串的纯文本.对此的简单解决方案是使用简单的XOR加密.问题是我需要一个转换器,在我的应用程序中它将如下所示:

//Before (unsecure)
char * cString = "Helllo Stackoverflow!";
//After (secure)
char * cString = XStr( 0x06, 0x15, 0x9D, 0xD5FBF3CC, 0xCDCD83F7, 0xD1C7C4C3, 0xC6DCCEDE, 0xCBC2C0C7, 0x90000000 ).c();
Run Code Online (Sandbox Code Playgroud)

是否有可能通过使用某些结构来维护干净的代码

//Before (unsecure)
char * cString = "Helllo Stackoverflow!";
//After (secure)
char * cString = CRYPT("Helllo Stackoverflow!");
Run Code Online (Sandbox Code Playgroud)

它也适用于很长的字符串(1000个字符?:-)).先感谢您

c++ encryption macros reverse-engineering

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

树的分治算法

我正在尝试为树木编写一个分而治之的算法.对于除法步骤,我需要一种算法,通过移除节点将给定的无向图G =(V,E)与n个节点和m个边分割成子树.所有子图应具有不包含超过n/2个节点的属性(树应尽可能分割).首先,我尝试以递归方式从树中删除所有叶子以找到最后剩余的节点,然后我尝试在G中找到最长的路径并删除它的中间节点.下面给出的图表显示两种方法都不起作用:

图形

是否有一些工作算法可以满足我的需要(在上述情况下返回节点H).

algorithm graph-theory divide-and-conquer graph-algorithm

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

g ++比使用列表的visual studio慢1000倍?

请考虑以下代码段:

#include <iostream>
#include <ctime>
#include <vector>
#include <list>
using namespace std;

#define NUM_ITER 100000

int main() {
    clock_t t = clock();
    std::list< int > my_list;
    std::vector< std::list< int >::iterator > list_ptr;

    list_ptr.reserve(NUM_ITER);

    for(int i = 0; i < NUM_ITER; ++i) {
        my_list.push_back(0);
        list_ptr.push_back(--(my_list.end()));
    }

    while(my_list.size() > 0) {
        my_list.erase(list_ptr[list_ptr.size()-1]);
        list_ptr.pop_back();
    }

    cout << "Done in: " << 1000*(clock()-t)/CLOCKS_PER_SEC << " msec!" << endl;
}
Run Code Online (Sandbox Code Playgroud)

当我使用visual studio编译并运行它时,启用了所有优化,我得到输出:

完成:8毫秒!

当我用g ++编译并运行它时,使用标志

g ++ main.cpp -pedantic -O2

我得到了输出

完成:7349毫秒!

这比粗鲁慢1000倍.这是为什么?根据"cppreference"调用列表上的擦除应该只用掉恒定时间.

代码在同一台机器上编译和执行.

c++ optimization stl g++ visual-studio

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

C++自引用类

我不得不承认我的C++有点生疏.在一个项目中,我尝试创建一个类向量并使用它们.有一个问题,因为我想识别向量的每个条目,并带有一个唯一的指针,以便快速访问,但它不起作用.这是我的问题的最小例子:

#include <iostream>
#include <vector>

class Foo{
public:
Foo() { ptr = this; }
~Foo() {}
Foo * ptr;
};

int main()
{
std::vector<Foo> vec;
for(unsigned int i = 0; i < 2; ++i)
  vec.push_back(Foo());
for(unsigned int i = 0; i < vec.size(); ++i)
 std::cout << "Object Self-Pointer: " << std::hex << reinterpret_cast<unsigned int>(vec[i].ptr) << std::endl; 
}
Run Code Online (Sandbox Code Playgroud)

实际产量:

Object Self-Pointer: bfbebc18
Object Self-Pointer: bfbebc18
Run Code Online (Sandbox Code Playgroud)

预期产量:

Object Self-Pointer: bfbebc18
Object Self-Pointer: bfbebc1c
Run Code Online (Sandbox Code Playgroud)

(一些指向实际对象的指针).

我希望你能帮我解决这个问题,提前谢谢你.

c++ stl vector

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