以下面的代码片段为例:
*pInt = 0xFFFF;
*pFloat = 5.0;
Run Code Online (Sandbox Code Playgroud)
由于他们是int和float指针,编译器将假定他们不这样做别名,例如可以交换.
现在让我们假设我们用这个来加强它:
*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*来为重新排列和其他严格的别名相关优化创建障碍?
从零使用开始:
>>> 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) 我正在尝试使用以下公式将 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) 我正在编写一个用于序列化和发送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,它没有说明其中包含什么类型。我怎么才能得到它?
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()比另一个更受青睐呢?
#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.
我们来看看代码
int a, b, c;
...
if ((a + b) > C)
Run Code Online (Sandbox Code Playgroud)
如果我们添加a和b的值并且总和超过int的最大值,那么比较的完整性是否会受到影响?我当时认为可能存在隐式向上转换或溢出位检查,这将被考虑到此表达式的评估中.
我正在阅读有关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)
并且,它编译成功。
它是如何工作的?
我正在编写一个简单的程序,它检查经过的时间是否超过 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”和“未过期超时”
哪里有问题?
我在理解这两个代码段之间的区别时遇到了一些麻烦:我使用以下语句在代码中动态地为整数数组分配空间
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)
它返回数组中实际的元素数.
如果有人能清楚这一点,那就太好了.谢谢!