小编aks*_*k07的帖子

取消引用char*会禁止严格的别名优化吗?

以下面的代码片段为例:

*pInt = 0xFFFF;
*pFloat = 5.0;
Run Code Online (Sandbox Code Playgroud)

由于他们是intfloat指针,编译器将假定他们不这样做别名,例如可以交换.

现在让我们假设我们用这个来加强它:

*pInt = 0xFFFF;
*pChar = 'X';
*pFloat = 5.0;
Run Code Online (Sandbox Code Playgroud)

因为char*允许别名,它可能指向*pInt,所以赋值*pInt不能超出赋值*pChar,因为它可以合法地指向*pInt并将其第一个字节设置为'X'.类似地pChar可以指向*pFloat,*pFloat在char赋值之前不能移动赋值,因为代码可能打算通过重新分配来取消先前字节设置的效果*pFloat.

这是否意味着我可以通过编写和读取char*来为重新排列和其他严格的别名相关优化创建障碍?

c strict-aliasing

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

清除对象后,为何仍在使用GPU中的内存?

从零使用开始:

>>> import gc
>>> import GPUtil
>>> import torch
>>> GPUtil.showUtilization()
| ID | GPU | MEM |
------------------
|  0 |  0% |  0% |
|  1 |  0% |  0% |
|  2 |  0% |  0% |
|  3 |  0% |  0% |
Run Code Online (Sandbox Code Playgroud)

然后创建一个足够大的张量并占用内存:

>>> x = torch.rand(10000,300,200).cuda()
>>> GPUtil.showUtilization()
| ID | GPU | MEM |
------------------
|  0 |  0% | 26% |
|  1 |  0% |  0% |
|  2 | …
Run Code Online (Sandbox Code Playgroud)

python garbage-collection memory-leaks gpu pytorch

9
推荐指数
3
解决办法
570
查看次数

X、Y 和 Z 在 geometry_msgs 中的含义 ROS 中的 Twist 消息

我正在尝试使用以下公式将 Twist 转换为左右轮的速度:

float speed_wish_right = (cmd_vel.angle*WHEEL_DIST)/2 + cmd_vel.speed;
float speed_wish_left = cmd_vel.speed*2-speed_wish_right;
Run Code Online (Sandbox Code Playgroud)

Twist.angular是一个向量 [x, y, z],所以是Twist.linear。x、y、z 在向量中是什么意思,如何从两个向量中获得角度和速度?

这是我在 Arduino 中的回调函数

const int WHEEL_DIST = 16;
void velCallback(geometry_msgs::Twist vel) {
  float linear = vel.linear.x;
  float angle = vel.angular.z;

  float speed_wish_right = (angle * WHEEL_DIST) / 2 + linear;
  float speed_wish_left = linear * 2 - speed_wish_right;
  motors.setSpeeds(speed_wish_left, speed_wish_right);
}
Run Code Online (Sandbox Code Playgroud)

ros

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

如何在python3中获取protobuf的RepeatedCompositeContainer或RepeatedScalarContainer包含的类型?

我正在编写一个用于序列化和发送protobuf3消息的 Python 应用程序。我想制作某种交互式用户界面,允许选择消息并动态分配它。我有一大堆这样的消息,因此我不想get为每条消息创建一个函数,而是创建一个可以处理所有消息的函数。

对于get所有消息字段,我可以简单地获取消息的所有属性并选择其字段,这很容易。然后,为了知道属性是什么类型,我使用type(getattr(my_message, current_field)). 现在问题来了。假设这些是我的消息:

message myMess1 {
    //some fields
}

message myMess2 {
    string some_string = 1
    repeated myMess1 myMess1Field = 2
}
Run Code Online (Sandbox Code Playgroud)

现在,分配 some_string 字段就没有问题了。

type(getattr(myMess2Instance, someStringFieldName))return string,所以我知道用字符串来填充它。

但是重复的 myMess1 字段该怎么办呢? type(getattr(MyMess2Instance, myMess1FieldName))实际上返回google.protobuf.pyext._message.RepeatedCompositeContainer,它没有说明其中包含什么类型。我怎么才能得到它?

python serialization backend protocol-buffers proto

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

为什么复制张量时建议使用 Tensor.clone().detach() ?

torch.tensor(sourcetensor)使用和复制张量有什么区别tensor.clone().detach()


就像torch.tensor(srctsr)总是复制数据一样,tensor.clone().detach()也复制数据。

x = torch.tensor([1, 2, 3])
y1 = x.clone().detach()
y2 = torch.tensor(x)
x[0] = 0
print(y1, y2) # both are same
Run Code Online (Sandbox Code Playgroud)

所以他们看起来是完全一样的。torch.tensor()下面是 PyTorch 文档中给出的关于和 的解释torch.clone().detach()

因此 torch.tensor(x) 等价于 x.clone().detach() 且 torch.tensor(x, require_grad=True) 等价于 x.clone().detach().requires_grad_(True)。建议使用 clone() 和 detach() 的等效方法。

那么,如果它们彼此相当,为什么.clone().detach()比另一个更受青睐呢?

pytorch

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

为什么iconv函数需要非const inbuffer?

iconv文档中,函数概要是这样的:

#include <iconv.h>

size_t iconv (iconv_t cd, const char* * inbuf, 
      size_t * inbytesleft, 
      char* * outbuf, 
      size_t * outbytesleft);
Run Code Online (Sandbox Code Playgroud)

但是,当我检查iconv.h我的系统时,功能概要是这样的:

extern size_t iconv (iconv_t __cd, char **__restirct __inbuf,
      size_t *__restrict __inbytesleft,
      char **__restirct __outbuf,
      size_t *__restrict __outbytesleft);
Run Code Online (Sandbox Code Playgroud)

在这两个函数概要中,一个是const char**,但另一个只是char**.

为什么文档中的函数概要与我系统中的函数概要不同?为什么iconv函数需要一个非const的inbuffer?

我的g ++版本是6.3.0.

c linux iconv

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

C:表达式求值中的隐式转换和整数溢出

我们来看看代码

int a, b, c;
...
if ((a + b) > C)
Run Code Online (Sandbox Code Playgroud)

如果我们添加a和b的值并且总和超过int的最大值,那么比较的完整性是否会受到影响?我当时认为可能存在隐式向上转换或溢出位检查,这将被考虑到此表达式的评估中.

c

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

具有未声明/未定义类型的 typedef 结构

我正在阅读有关VAD的webrtc源代码,我对代码感到困惑

typedef struct WebRtcVadInst VadInst;
Run Code Online (Sandbox Code Playgroud)

我搜索了所有关于WebRtcVadInst的代码,没有找到任何与struct WebRtcVadInst相关的来源。另一方面,我确实找到了一些关于VadInst 的信息。

typedef struct VadInstT_ {
    int vad;
    int32_t downsampling_filter_states[4];
    ...
    ...
    int init_flag;
} VadInstT;
Run Code Online (Sandbox Code Playgroud)

VadInst* WebRtcVad_Create() {
  VadInstT* self = (VadInstT*)malloc(sizeof(VadInstT));

  WebRtcSpl_Init();
  self->init_flag = 0;

  return (VadInst*)self;
}
Run Code Online (Sandbox Code Playgroud)

并且,它编译成功。

它是如何工作的?

c c++ webrtc

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

C、clock_gettime,返回了不正确的纳秒值?

我正在编写一个简单的程序,它检查经过的时间是否超过 1 秒。我使用clock_gettime()获取开始时间,然后调用sleep(5),获取新时间并检查差异是否大于1;我睡了 5 秒,那么它应该大于 5,但我的程序打印了一个奇怪的结果。

这是代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>

int main()
{
    struct timespec tv1,tv3,expected;
    struct timespec nano1;

    tv1.tv_nsec = 0;
    tv3.tv_nsec = 0;

    expected.tv_nsec = 400000;

    if(clock_gettime(CLOCK_MONOTONIC,&tv3) == -1){
        perror(NULL);
    }

    sleep(5);

    if(clock_gettime(CLOCK_MONOTONIC,&tv1) == -1){
        perror(NULL);
    }


    long nsec = tv1.tv_nsec - tv3.tv_nsec;

    if(nsec>expected.tv_nsec){
        printf("nsec runned: %ld   nsec timeout: %ld\n",nsec,expected.tv_nsec);
    }


    printf("elapsed nanoseconds: %ld\n",nsec);


    if((nsec>expected.tv_nsec))
        printf("expired timer\n");

    else
        printf("not expired timer\n");

    exit(EXIT_SUCCESS);
}
Run Code Online (Sandbox Code Playgroud)

我的程序的输出是:

“经过的纳秒:145130”和“未过期超时”

哪里有问题?

c posix gettime timer

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

C动态内存分配和sizeof()

我在理解这两个代码段之间的区别时遇到了一些麻烦:我使用以下语句在代码中动态地为整数数组分配空间

int *arr = calloc(cnt, sizeof(int));
Run Code Online (Sandbox Code Playgroud)

在另一个函数中,我传入arr,我想确定arr中的大小(元素数量).我打电话的时候

int arr_sz = sizeof(arr)/sizeof(int);
Run Code Online (Sandbox Code Playgroud)

它只返回1,这只是我假设(4/4)= 1的两个参数的int中的字节数.我只是假设它与使用数组相同

  int arr[8];
  int arr_sz = sizeof(arr)/sizeof(int);
Run Code Online (Sandbox Code Playgroud)

它返回数组中实际的元素数.

如果有人能清楚这一点,那就太好了.谢谢!

c memory

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